虽然hash算法种类很多很多。然而,由于有先例(MD5,SHA-1,ripemd都不安全),我们很难保证使用那些标准的hash算法不会导致将来的不安全。于是,自己设计一个新的保密的hash算法就成了绝佳的选择。如何设计呢?
作者认为,至少有以下3种方法:
- 按照普通Hash算法模式设计
- 修改标准Hash算法
- 利用加密算法来构造Hash算法
第一种办法设计到的东西和内容很多,作者暂时没有这个能力去设计一个安全度很高的Hash算法。
第二种办法很容易做到,大家都知道,任何一种hash算法都会有很多的常量,我们可以找到其中的几个常量,把它们修改成其它值。为了安全起见,把这些值修改成大素数是一个不错的选择。不过,这样修改之后,hash算法的安全度可能变低了(也可能变高了),所以,对修改后的算法进行保密是很必要的。
第三种办法。已经知道,hash算法和加密算法有着特别的大的联系。hash函数本来就是一个单向函数,而加密函数其实是一个陷门单向函数。设计hash算法的时候,可以直接利用对称加密函数。以下是一个简单的例子:
基于AES的hash函数:
- 在输入数据后面添加数据,添加方式和md5一样。
- 把数据进行分组,每组128位。
- 设第一组为m[0-15],计算f(m),得到16个字节,设为k[0-15]。这里,f(m)是一个非线性变换,可以是不可逆的。
- 取第i组值,i初始化为0,设为m[0-15],计算AES(m,k);令k = AES(m,k);
- 重复第4步,直到全部分组都被计算完毕。
- 输出k。k显然为128位。
可以看到,本hash算法具有很高的安全度,每次的m和k几乎没有任何联系(除了第一次加密以外)。其主要缺点是每次只计算16个字节,一般的Hash算法都计算64个字节。这导致了本算法的速度慢了许多。