l MD5(Message Digest Algorithm 5):是RSA資料安全公司開發的一種單向散列演算法。
l SHA(Secure Hash Algorithm):可以對任意長度的資料運算產生一個160位的數值;
SHA-1
在1993年,安全散列演算法(SHA)由美國國家標準和技術協會(NIST)提出,並作為聯邦資訊處理標準(FIPS PUB 180)公布;1995年又發布了一個修訂版FIPS PUB 180-1,通常稱之為SHA-1。SHA-1是基於MD4演算法的,並且它的設計在很大程度上是模仿MD4的。現在已成為公認的最安全的散列演算法之一,並被廣泛使用。
MD5 與SHA-1 的比較
因為二者均由MD4匯出,SHA-1和MD5彼此很相似。相應的,他們的強度和其他特性也是相似,但還有以下幾點不同:
l 對強行攻擊的安全性:最顯著和最重要的區別是SHA-1摘要比MD5摘要長32 位。使用強行技術,產生任何一個報文使其摘要等於給定報摘要的難度對MD5是2^128數量級的操作,而對SHA-1則是2^160數量級的操作。這樣,SHA-1對強行攻擊有更大的強度。
l 對密碼分析的安全性:由於MD5的設計,易受密碼分析的攻擊,SHA-1顯得不易受這樣的攻擊。
l 速度:在相同的硬體上,SHA-1的運行速度比MD5慢。
JAVA內建java.security.MessageDigest實現:
package com.redhamr.util;import java.io.*;import java.security.MessageDigest;public class HashCrypt { /*** * MD5加碼 產生32位md5碼 */ public static String string2MD5(String inStr){ MessageDigest md5 = null; try{ md5 = MessageDigest.getInstance("MD5"); }catch (Exception e){ System.out.println(e.toString()); e.printStackTrace(); return ""; } char[] charArray = inStr.toCharArray(); byte[] byteArray = new byte[charArray.length]; for (int i = 0; i < charArray.length; i++) byteArray[i] = (byte) charArray[i]; byte[] md5Bytes = md5.digest(byteArray); StringBuffer hexValue = new StringBuffer(); for (int i = 0; i < md5Bytes.length; i++){ int val = ((int) md5Bytes[i]) & 0xff; if (val < 16) hexValue.append("0"); hexValue.append(Integer.toHexString(val)); } return hexValue.toString(); } /** * 加密解密演算法 執行一次加密,兩次解密 */ public static String convertMD5(String inStr){ char[] a = inStr.toCharArray(); for (int i = 0; i < a.length; i++){ a[i] = (char) (a[i] ^ 't'); } String s = new String(a); return s; } // 測試主函數 public static void main(String args[]) { String s = new String("lcx123"); System.out.println("原始:" + s); System.out.println("MD5後:" + string2MD5(s)); System.out.println("解密的:" + convertMD5(convertMD5(s))); } }
Spring中MD5是由org.springframework.security.authentication.encoding.Md5PasswordEncoder
而SHA是由org.springframework.security.authentication.encoding.ShaPasswordEncoder:
package com.esoft.core.util;import org.springframework.security.authentication.encoding.Md5PasswordEncoder;import org.springframework.security.authentication.encoding.PasswordEncoder;import org.springframework.security.authentication.encoding.ShaPasswordEncoder;public class HashCrypt {public static String SHA = "SHA";public static String MD5 = "MD5";private final static PasswordEncoder shaPasswordEncoder = new ShaPasswordEncoder();private final static PasswordEncoder md5PasswordEncoder = new Md5PasswordEncoder();public static String getDigestHash(String str) {return getDigestHash(str, "SHA");}public static String getDigestHash(String str, String hashType) {if (str == null)return null;return getDigestHash(str, hashType,null);}public static String getDigestHash(String str, String hashType,Object salt ) {if(hashType == null){hashType = SHA ;}if(hashType.equals(MD5)){return md5PasswordEncoder.encodePassword(str, salt);}return shaPasswordEncoder.encodePassword(str, salt);}public static void main(String[] args) {System.out.println( getDigestHash("jhsx128710104") );}}
Null 字元串:
sha("")= da39a3ee5e6b4b0d3255bfef95601890afd80709
md5("")=d41d8cd98f00b204e9800998ecf8427e