摘要函数 —— 获取消息的“指纹”

介绍:

摘要函数也称之为单项散列函数(one-way hash function),其中包含一个输入称为消息(message),一个输出称为散列值(hash value)。单向散列函数可以 根据消息的内容计算出散列值,而散列值就可以用来检查消息的完整性。

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

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


单向散列函数的特性

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

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

消息不同散列值也不同
如果单向散列函数计算出的散列值没有发生变化,那么消息很容易就会被篡改,这和单向散列函数也就无法被用于完整性的检查。两个不同的消息产生同一个散列值的情况称为碰 撞(collision)。如果要将单向散列函数用于完整性的检查,则需要确保在事实上不可能被人为地发现碰撞。
难以发现碰撞的性质称为抗碰撞性(collision resistance)。密码技术中所使用的单向散列函数,都需要具备抗碰撞性。

当给定某条消息的散列值时,单向散列函数必须确保要找到和该条消息具有相同散列值的另外一条消息是非常困难的。这一性质称为弱抗碰撞性。单向散列函数都必须具备弱抗碰撞性。

和弱抗碰撞性相对的,还有强抗碰撞性。所谓强抗碰撞性,是指要找到散列值相同的两条不同的消息是非常困难的这一性质。在这里,散列值可以是任意值。

能够快速计算出散列值
单向散列函数必须具备单向性(one-way)。单向性指的是无法通过散列值反算出消息的性质。根据消息计算散列值可以很容易,但这条单行路是无法反过来走的。

正如同将玻璃砸得粉碎很容易,但却无法将碎片还原成完整得玻璃一样,根据消息计算出散列值很容易,但根据散列值却无法反算出消息。

在这里需要注意的一点是,尽管单向散列函数所产生的散列值是和原来的消息完全不同的比特序列,但是单向散列函数并不是一种加密,因此无法通过解密将散列值还原成原来的消息。
+