MessageDigest的選擇好多,包括MD2、MD4、MD5、SHA-1、SHA-256、RIPEMD128、RIPEMD160等等。我們?nèi)绾芜x擇呢?
選擇考慮在兩個方面:安全、速度。
MD2很安全,但是速度極慢,一般不用。
速度方面,最快的是MD4,MD5比SHA-1快
速度排名:MD4 > MD5 > RIPEMD-128 > SHA-1 > REPEMD-160
按照《應(yīng)用密碼學(xué)手冊》提供的表格數(shù)據(jù)為:
MD4 長度 128 相對速度 1
MD5 長度 128 相對速度 0.68
REPEMD-128 長度 128 相對速度 0.39
SHA-1 長度 160 相對速度 0.29
REPEMD-160 長度 160 相對速度 0.24
我親自測試的結(jié)果和《應(yīng)用密碼學(xué)手冊》提供的數(shù)據(jù)接近。
MD4已經(jīng)很早證明有缺陷,很少使用,最流行的是MD5和SHA-1,但MD5和SHA1也被王小云找到碰撞,證實不安全。
傳說SHA-1比MD5要安全,但是SHA-1有美國國家安全局的背景,有人懷疑這個算法背后有不可告人的秘密,我也是陰謀論者之一,傾向選擇MD5而不是SHA-1。王小云找到SHA-1碰撞之后,可以說傳說的謠言破滅了,而且MD5速度要比SHA-1快差不多一倍,沒有什么理由選擇SHA-1。
----------------------------------
在Java的現(xiàn)實環(huán)境中是怎樣?
在SUN的JCE實現(xiàn)中,只提供了MD2、MD5、SHA-1,SHA-256等常用的MessageDigest算法。
開源的JCE實現(xiàn)bouncycastle則提供了眾多的實現(xiàn),包括MD整個系列,SHA整個系列,RIPEMD整個系列。
很多的開源項目都帶一個bcprov-jdk14.jar的包,可以說bouncycastle應(yīng)用很廣泛。SUN公司的一些項目也用了bouncycastle,例如JXTA。
但實際上,SUN的實現(xiàn)包括了MD4,但你需要這樣使用:
MessageDigest md = sun.security.provider.MD4.getInstance();
但是,JDK帶實現(xiàn)性能要比bouncycastle性能好得多,相差速度通常超過一倍以上,我測試過MD5、SHA1和MD4,其性能差別都是類似,一倍多。
比較的結(jié)論:
bouncycastle開源免費,提供算法多,但速度較慢
SUN JCE提供的實現(xiàn),包括了流行常用算法,速度很快,同類型算法比bouncycastle要快一倍以上。
----------------------------------
結(jié)論:
又要安全又要速度,選擇MD5
追求安全,不在意速度,相信傳說,不相信陰謀論,選擇SHA系列
追求速度,安全次之,可以選擇MD4。
----------------------------------
現(xiàn)實例子:
emule采用MD4和SHA-1兩種結(jié)合使用
apache之類的技術(shù)網(wǎng)站,提供下載的文件,同時提供一個校驗文件.md5