您现在的位置是:首页 > 技术笔记 > 密码学密码学

单向散列函数

冰山2019-03-05【密码学】人已围观

简介1. 单向散列函数
1.1 定义
1.2 关于术语
1.3 单向散列函数的性质
1.4 单向散列函数的实际应用
1.4.1检测软件是否被篡改
1.4.2消息认证码
1.4.3数字签名
1.4.4伪随机数生成器
1.4.5一次性口令
1.5 常用的单向散列函数
1.5.1 MD4、MD5
1.5.2 Golang中使用MD5
1.5.3 SHA-1、SHA-224、SHA-256、SHA-384、SHA-512标准

1. 单向散列函数

 

1.1 定义


在说单向散列函数是什么之前,让我们先看一下生活中的案例,在刑事侦查中,侦查员会用到指纹。通过将某个特定人物的指纹与犯罪现场遗留的指纹进行对比,就能够知道该人物与案件是否存在关联。
 
同样针对计算机所处理的消息,当我们需要比较两条消息是否一致时,我们也需要检测其“指纹",我们不必直接对比消息本身的内容,只需要对比它们的“指纹”,就可以知道了,所以可以这样理解"单向散列函数 --- 获取消息的指纹"。
 
单向散列函数(one-wayftnction)有一个输入和一个输出,其中输入称为消息(message),输出称为散列值(hashvalue)。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性。



这里的消息不一定是人类能够读懂的文字,也可以是图像文件或者声音文件。单向散列函数不需要知道消息实际代表的含义。无论任何消息,单向散列函数都会将它作为单纯的比特序列来处理,即根据比特序列计算出散列值。

散列值的长度和消息的长度无关。无论消息是1比特,还是100MB,甚至是I00GB,单向散列函数都会计算出固定长度的散列值。以SHA-I单向散列函数为例,它所计算出的散列值的长度永远是160比特(20字节)。

1.2 关于术语


单向散列函数的相关术语有很多变体,不同参考资料中所使用的术语也不同,我只总结了其中的几个。

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

顺便说一句,单向散列函数中的“散列”的英文"hash一词,原意是古法语中的“斧子”,后来被引申为“剁碎的肉末",也许是用斧子一通乱剁再搅在一起的那种感觉吧。单向散列函数的作用,实际上就是将很长的消息剁碎,然后再混合成固定长度的散列值。
 

1.3 单向散列函数的性质


通过使用单向散列函数,即便是确认几百MB大小的文件的完整性,也只要对比很短的散列值就可以了。那么,单向散列函数必须具备怎样的性质呢?我们来整理一下。

 

根据任意长度的消息计算出固定长度的散列值


首先,单向散列函数的输入必须能够是任意长度的消息。
 
其次,无论输入多长的消息,单向散列函数必须都能够生成长度很短的散列值,如果消息越长生成的散列值也越长的话就不好用了。从使用方便的角度来看,散列值的长度最好是短且固定的。
 

能够快速计算出散列值

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

消息不同散列值也不同

 
为了能够确认完整性,消息中哪怕只有1比特的改变,也必须有很高的概率产生不同的散列值。
 
如果单向散列函数计算出的散列值没有发生变化,那么消息很容易就会被篡改,这个单向散列函数也就无法被用于完整性的检查。两个不同的消息产生同一个散列值的情况称为碰撞(collision)。如果要将单向散列函数用于完整性的检查,则需要确保在事实上不可能被人为地发现碰撞。






难以发现碰撞的性质称为抗碰撞性(collisionresistance)。密码技术中所使用的单向散列函数,都需要具备抗碰撞性。

强抗碰撞性,是指要找到散列值相同的两条不同的消息是非常困难的这一性质。在这里,散列值可以是任意值。密码技术中的单向散列函数必须具备强抗碰撞性。

 1/4    1 2 3 4 下一页 尾页

  • 微信扫一扫~
  • 支付宝扫一扫~

很赞哦! ()

上一篇:非对称加密

下一篇:消息认证码

文章评论

本站推荐