HASH算法简介
Posted 江文团二世
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HASH算法简介相关的知识,希望对你有一定的参考价值。
前段时间和几位计算机专业的粉丝聚餐,聊着聊着聊到了HASH算法。于是请了KK为大家科普一下HASH算法,KK写的知识水平非常高。简单的说,HASH算法的用途之一是防止报道出现偏差。
简介
首先明确一点,这里所谓的HASH算法并不是大学里数据结构里的HASH表算法。这里的HASH算法是密码学的基础。HASH算法,或者叫HASH函数就是将任意长度的数据映射到有限长度的域上。类似于高中所学的函数的定义,就是将任意长度的输入值X,映射到有限长度的输出值Y上的函数。也就是说,无论输入X有多长,其输出值Y为固定长度。(钦定的长度?)目前世界上比较常见的两种是MD5和SHA。
性质
HASH函数最重要的两条性质,就是不可逆和无冲突。所谓不可逆,就是当你知道X的HASH值——也就是上文所提到的Y,无法求出X;所谓无冲突,就是当你知道X1,无法找出另一个X2, 使X1与X2的HASH值相同。
但是,这两条性质在数学上都是不成立的。因为一个函数必然可逆,且由于HASH函数的值域有限,理论上会有无穷多个不同的X值,它们的HASH值都相同。MD5和SHA做到的,是求逆和求冲突在计算上不可能,也就是正向计算很容易,而反向计算即使穷尽人类所有的计算资源都做不到。近几年炒得很火的量子计算机据说有能力可以进行反向计算,暂不予评论。
应用
比如说,我写了一篇文章,摘要是一段话:“把扬州建设成为古代文化与现代文明交相辉映的名城”,并附上这篇文章的摘要(HASH值)是:“7B6673604E03E39ABE8F8D67A7A5C4EC”。如果有人篡改了我的文章,并发表为:“把广州建设成为古代文化与现代文明交相辉映的名城”,我可以立即发现我的文章被篡改过,因为根据“把广州建设成为古代文化与现代文明交相辉映的名城”计算出的摘要不同于原始文章的摘要。这也是现在HASH算法应用最广泛的场景之一了。
这里之所以篡改可以被发现,就是因为摘要函数是一个单向函数,计算Y很容易,但通过d摘要反推X却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。不过上文也有说到,是完全可以通过不同的输入得到相同的输出的,即md5(a) = md5(b)。我们将这种情况称为HASH碰撞。一个好的HASH算法中,应该存在大量不同的数据串,因此碰撞这种情况极其罕见。
HASH算法是密码学的主要算法。现今已经在人们的生活中十分常见。任何允许用户登录的网站都会存储用户登录的用户名和密码。如果以明文保存用户密码,如果数据库泄露,所有用户的口令就落入黑客的手里,并且运维人员是可以访问数据库的,也就是能获取到所有用户的密码。所以正确的做法是保存保存用户密码的摘要,然后将其与数据库中的摘要进行对比,如果一致,就代表密码正确,不一致,就代表密码错误。
我本来想写的通俗一些的,但是我很快发现我已经忘完了。
以上是关于HASH算法简介的主要内容,如果未能解决你的问题,请参考以下文章