10.3 单向加密
之前我们介绍的加密算法都是双向的,也就是加密后可以再逆向算出明文数据,而在加密算法里面,还有单向加密,也就是不可逆算法,常见的有MD系列(md4、md5)和sha1等。因为存在不可逆的性质,所以这类哈希算法通常用来保存密码和做数字签名,不过因为相同的字符串的哈希值是一样的,所以存在碰撞的问题,目前全球公开的最大MD5解密库cmd5.com号称有24万亿条数据,解密率全球第一,笔者在实际应用中也感受到普通人常用的密码破解成功率也在90%以上。
MD5/sha1加密
MD5是目前使用最多的密码存储加密算法,几乎95%以上的网站都在使用MD5算法,MD5分为16位和32位,实际上它们的安全性并没有什么不一样的地方。根据实际经验来看,用单纯MD5(不加salt)来存储用户密码是非常不安全的,提供MD5解密的网站随处可见,如cmd5.com、xmd5.com,等等。
在PHP中进行MD5计算很简单,PHP提供了md5()函数,只要传入一个字符串即可返回加密后的结果。
同样,sha1加密也被部分网站用来保存密码,它比MD5更长,足足有40位,支持sha1解密的网站相对较少,碰撞的数据量也相对较少,所以实际中它的“安全性”比MD5更好。我们来看看它的使用方法,代码如下:
< ? php
echo 'phpsec md5 : '.md5 ( 'phpsec' );
echo '<br />' ;
echo 'phpsec sha1 : '.sha1 ( 'phpsec' );
执行结果如图10-7所示。
图 10-7