A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 wanbo万波 于 2018-6-20 13:56 编辑

1. 单向散列函数(哈希函数)
  • 概念
    单向散列函数(one-wayftnction)有一个输人和一个输出,其中输人称为消息(message),输出称为散列值(hashvalue)。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性。

    • 单向散列函数也称为消息摘要函数(message digest function)、哈希函数或者杂凑函数
    • 单向散列函数输出的散列值也称为消息摘要(message digest)或者指纹(fingerprint)。
    • 完整性也称为一致性。


1.1  哈希函数的特点
  • 压缩性

    • 任意长度的数据,算出的值长度都是固定的。



  • 容易计算

    • 计算散列值所花费的时间必须要短。尽管消息越长,计算散列值的时间也会越长,但如果不能在现实的时间内完成计算就没有意义了。

  • 抗修改性

    • 对原数据进行任何改动,哪怕只修改1个字节,所得到的值都有很大区别



  • 强抗碰撞性

    • 已知原数据和其哈希值,想找到一个具有相同哈希值的数据(即伪造数据)是非常困难的。



  • 单向性(不可逆)

1.2 哈希函数的应用
  • 检测软件是否被篡改
    我们可以使用单向散列函数来确认自己下载的软件是否被篡改。
    很多软件,尤其是安全相关的软件都会把通过单向散列函数计算出的散列值公布在自己的官方网站上。用户在下载到软件之后,可以自行计算散列值,然后与官方网站上公布的散列值进行对比。通过散列值,用户可以确认自己所下载到的文件与软件作者所提供的文件是否一致。
    这样的方法,在可以通过多种途径得到软件的情况下非常有用。为了减轻服务器的压力,很多软件作者都会借助多个网站(镜像站点)来发布软件,在这种情况下,单向散列函数就会在检测软件是否被篡改方面发挥重要作用。
  • 消息认证码
    使用单向散列函数可以构造消息认证码。
    消息认证码是将“发送者和接收者之间的共享密钥”和“消息,进行混合后计算出的散列值。使用消息认证码可以检测并防止通信过程中的错误、篡改以及伪装。
  • 数字签名
    在进行数字签名时也会使用单向散列函数。
    数字签名是现实社会中的签名(sign)和盖章这样的行为在数字世界中的实现。数字签名的处理过程非常耗时,因此一般不会对整个消息内容直接施加数字签名,而是先通过单向散列函数计算出消息的散列值,然后再对这个散列值施加数字签名。
  • 伪随机数生成器
    使用单向散列函数可以构造伪随机数生成器。
    密码技术中所使用的随机数需要具备“事实上不可能根据过去的随机数列预测未来的随机数列”这样的性质。为了保证不可预测性,可以利用单向散列函数的单向性。
  • 一次性口令或登录验证
    使用单向散列函数可以构造一次性口令(one-time password)。
    一次性口令经常被用于服务器对客户端的合法性认证。在这种方式中,通过使用单向散列函数可以保证口令只在通信链路上传送一次(one-time),因此即使窃听者窃取了口令,也无法使用。

1.3 常用的哈希函数
  • Md4、Md5
    MD4是由Rivest于1990年设计的单向散列函数,能够产生==128比特==的散列值(RFC1186,修订版RFC1320)。不过,随着Dobbertin提出寻找MD4散列碰撞的方法,因此现在它已经不安全了。
    MD5是由Rwest于1991年设计的单项散列函数,能够产生==128比特==的散列值(RFC1321)。
    MD5的强抗碰撞性已经被攻破,也就是说,现在已经能够产生具备相同散列值的两条不同的消息,因此它也已经不安全了。
    MD4和MD5中的MD是消息摘要(Message Digest)的缩写。
  • SHA-1、SHA-256、SHA-384、SHA-512
    SHA-1是由NIST(National Institute Of Standardsand Technology,美国国家标准技术研究所)设计的一种能够产生==160比特==的散列值的单向散列函数。1993年被作为美国联邦信息处理标准规格(FIPS PUB 180)发布的是SHA,1995年发布的修订版FIPS PUB 180-1称为SHA-1。
    SHA-1的消息长度存在上限,但这个值接近于2^64^比特,是个非常巨大的数值,因此在实际应用中没有问题。
    SHA-256、SHA-384和SHA-512都是由NIST设计的单向散列函数,它们的散列值长度分别为==256比特==、==384==比特和==512比特==。这些单向散列函数合起来统称SHA-2,它们的消息长度也存在上限(SHA-256的上限接近于 2^64^ 比特,SHA-384 和 SHA-512的上限接近于 2^128^ 比特)。这些单向散列函数是于2002年和 SHA-1 一起作为 FIPS PUB 180-2发布的 SHA-1 的强抗碰撞性已于2005年被攻破, 也就是说,现在已经能够产生具备相同散列值的两条不同的消息。不过,SHA-2还尚未被攻破。

[td]
哈希函数
散列值长度(bit)
散列值长度(byte)
Md4/Md5
128bit
16byte
SHA-1
160bit
20byte
SHA-256
256bit
32byte
SHA-384
384bit
48byte
SHA-512
512bit
64byte
SHA-224
224bie
28byte
最终需要对得到的散列值做转换, 以16进制格式的字符串表示

1 个回复

正序浏览
baby14 来自手机 金牌黑马 2018-6-16 12:46:37
沙发
多谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马