哈希

  今天想了解一下区块链,就看到了哈希算法.

  它可以将任意数据通过一个函数转换成长度固定的数据串(通常用16进制的字符串表示),函数与数据串之间形成一一映射的关系。

在知乎上有一个挺好的回复:

作者:旅行者yo
链接:https://www.zhihu.com/question/20820286/answer/333248794
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

哈希算法又称为摘要算法,它可以将任意数据通过一个函数转换成长度固定的数据串(通常用16进制的字符串表示),函数与数据串之间形成一一映射的关系。

举个粒子,我写了一篇小说,摘要是一个string:'关于甲状腺精灵的奇妙冒险',并附上这篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了我的文章,并发表为'关于JOJO的奇妙冒险',我可以立即发现我的文章被篡改过,因为根据'关于JOJO的奇妙冒险'计算出的摘要不同于原始文章的摘要。

可见,摘要算法就是通过摘要函数f()任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

那~~有没有可能两个不同的数据通过某个摘要算法得到了相同的摘要呢?完全有可能!因为任何摘要算法都是把无限多的数据集合映射到一个有限的集合中。这种情况称为碰撞。

一个好的哈希算法中,应该存在大量不同的数据串,因此碰撞这种情况极其罕见。

MD5是现在最常用的哈希算法之一,如楼上所说王小云教授曾经成功制造出MD5的碰撞,即md5(a) = md5(b)。这样的碰撞只能随机生成,并不能根据一个已知的a求出b(即并没有破坏MD5的无冲突特性)。但这已经让他声名大噪了。

哈希算法是密码学的主要算法。举个常用的例子,任何允许用户登录的网站都会存储用户登录的用户名和口令。如何存储用户名和口令呢?方法是存到数据库表中。如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,然后将其与数据库中的摘要进行对比,如果一致,就代表口令正确,不一致,就代表口令错误。

posted @ 2018-03-26 11:17  〃拥有小太阳的向日葵ヾ  阅读(127)  评论(0)    收藏  举报