散列函数
散列函数,也叫杂凑函数,实际就是哈希(Hash)函数,“散列函数”是信息安全领域惯用的译法。
不论从概念还是从形式上看,它跟数据结构课程上讲的哈希函数的确如出一辙:基于任意输入都产生定长的输出,且好的散列函数值域会分布得尽量平均。
然而,信息安全领域使用的散列函数却有着诸多安全方面的要求。像针对字符串的每个字节不断乘以一个素数并取模的那种哈希函数,在数据结构领域用于构造关联数组已经相当好了,但在信息安全领域却远远不合格。除任意输入,定长输出之外,信息安全领域中使用的散列函数还有以下要求(设H是散列函数):
(1)单向性:已知内容(常称为“报文”)x,计算h = H(x)相对容易;而已知散列值h1,要寻找给定的内容x1,使H(x1) = h1则非常困难;
(2)抗冲突性:已知报文x,寻找另外一个报文y,使得H(x) = H(y)非常困难。最好能做到:随便找一对x,y,使H(x) = H(y)都非常困难。一般前者称为弱抗冲突性,后者称为强抗冲突性。
此外,一个好的散列函数也应该具有本文(一)中曾经提到的“雪崩效应”。
常见的散列函数包括MD5,SHA系列等。
MD5可针对任意输入产生128bit(16字节)的输出。SHA是一组散列函数的统称,包括SHA-0、SHA-1、SHA-2等,产生160到512bit之间的散列值。
<