Hash,一般翻译做散列,或音译为哈希,普遍将其称之为散列函数,是把任意长度的输入(又叫做预映射pre-image)哈希算法的处理,转变为固定长度的输出,则输出的数据就可称之为散列值,或称之为哈希值。这种转换是一种压缩映射,也就是一种合理压缩的过程,输出的哈希值所占用的空间远小于输入的空间,但不同的输入可能会散列成相同的输出,换言之,输出值是唯一的,但无法找寻与其一一对应的输入值。
哈希函数的目标是将任意长度的输入,通过变换后得到固定长度的输出值。本文由MrsFu123编辑整理,有需开发,请V小编。,输入值称为消息(Message),输出值称为散列值、消息摘要(message digest)或者指纹。因此,哈希也称为消息摘要函数(message digest function)。
密码学中的哈希函数具有如下特性:
(1)不管是消息的长度是多少,散列值都是有固定长度的;
(2)相同的消息,散列值是相同的,不相同的消息,散列值是不相同的;
(3)可以通过消息计算出散列值,但是无法通过散列值计算出消息;
(4)不管消息的长度有多长,都要在短时间内完成散列值的计算;
如果不同的消息,计算出了相同的散列值,就产生了冲突,或者称为碰撞。
如发生了碰撞,则相应的哈希函数在密码学中就不再安全。
所以,哈希函数的职责就是构建一个不会产生碰撞的算法。
无法通过散列值计算出消息,这一特性称为单向性,哈希函数也被称为单向散列函数。
满足哈希特性的函数都称为哈希函数。常见的有:MD5、SHA-1(Secure Hash Algorithm)、SHA256、SHA512。
二、MD5
MD5信息-摘要算法(Message-Digest Algorithm5)是一种哈希算法,散列值的位数是128位。现已被破解。
MD5生成固定位数散列值的大致步骤是:
(1)将消息进行补位,消息长度的目标值是512*N+448+64。
如果位数不足448,则需补位,规则是第1位填充1,其余位填充0。
剩余的位数64位(512-448)记录了消息的原始长度,处理后消息的长度为M=512*(N+1)。
(2)设置散列值的初始值。
MD5哈希散列值为128位,每32位为一组,散列值共分4组,每组分别指定初始值:
0x01234567、0x89ABCDEF、0xFEDCBA98、0x76543210(从0到15,再从15到0)。
(3)预设公式与常数表
A.4个线性函数
F(X,Y,Z)=(X&Y)|((~X)&Z)
G(X,Y,Z)=(X&Z)|(Y&(~Z))
H(X,Y,Z)=X^Y^Z
I(X,Y,Z)=Y^(X|(~Z))
进行与、或、非或异或的操作。
B.1个常数表
记为T<i>(i=1~64),T<i>=4294967296*abs(sin(i))
(4)计算
MD2散列值的计算,需要有两层循环
外层:
对M进行循环计算,每次512位,循环次数为N+1。
内层:
对512位分成16组,每组32位。
对每个分组进行4轮运算:
A=B+((A+F(B,C,D)+M[j]+T<i>)<<<S)
A=B+((A+G(B,C,D)+M[j]+T<i>)<<<S)
A=B+((A+H(B,C,D)+M[j]+T<i>)<<<S)
A=B+((A+I(B,C,D)+M[j]+T<i>)<<<S)
(5)拼接ABCD,形成MD5散列值。
由于散列函数应用的多样性,它们经常是专为某一应用而设计的。
使用一个散列函数可以很直观地检测出数据在传输时发生的错误。在数据的发送方,将散列函数应用于未发送的数据中,并将计算结果和原始数据一同发送。那么,在数据的接收方,将接收到的数据利用相同的散列函数进行处理,如果两次散列函数计算出来的结果不同,那么就说明数据在传输的过程中出现了差错。这就叫做冗余校验。
信息安全
Hash算法是现代密码体系中保密程度最高的一种方式。由于非对称算法既费时又费力的弊端,所以在数字签名协议中,单向散列函数完全的取代了传统的加密方式。