MD5:一種哈希算法
實質上,MD5 只是一種哈希算法。
哈希算法,即 hash,又叫散列算法,是一類把任意數據轉換為定長(或限制長度)數據的算法統稱。例如我叫張三,你叫李四,那么「人 -> 人名」的算法就叫屬於一種哈希算法。哈希算法通常用於制作數字指紋,數字指紋的意思就是「你看到這個東西就像看到原數據一樣」,例如我們在一些網站下載大文件的時候,網站提供給我們驗證文件完整性的 MD5 或者 SHA1 碼,就是原文件的哈希值。哈希算法有很多種,MD5 是其中的一種,這就是 MD5。所以,優秀的哈希算法通常需要具有低碰撞概率(即不同數據的哈希值通常也不一樣)。
加密是什么?
加密,指的是對數據進行轉換以后,數據變成了另一種格式,並且除了拿到解密方法的人,沒人能把數據轉換回來。因此,加密通常用於網絡通信。因為網絡上的通信數據,任何人都有可能會拿到,把數據加密后再傳送,送達以后由對方解密后再查看,就可以防止網絡上的偷窺。例如大家都知道「安全」但很少人知道「為什么安全」的 HTTPS,就是通過加密算法來保障的網絡安全性。
所以,MD5 是加密嗎?
加密算法的目的,在於別人無法成功查看加密后的數據,並且在需要的時候還可以對數據進行解密來重新查看數據。而 MD5 算法是一種哈希算法,哈希算法的設計目標本身就決定了,它在大多數時候都是不可逆的,即你經過哈希算法得出的數據,無法再經過任何算法還原回去。所以,既然不能將數據還原,也就不能稱之為可以解密;既然不能解密,那么哈希的過程自然也就不能稱作是「加密」了。
1 加密方法:
1.1 java自帶jar工具MessageDigest實現
java.security.MessageDigest
public class MD5Utils { public static String stringToMD5(String plainText) { byte[] secretBytes = null; try { secretBytes = MessageDigest.getInstance("md5").digest( plainText.getBytes()); } catch (NoSuchAlgorithmException e) { throw new RuntimeException("沒有這個md5算法!"); } String md5code = new BigInteger(1, secretBytes).toString(16); for (int i = 0; i < 32 - md5code.length(); i++) { md5code = "0" + md5code; } return md5code; } }
1.2 spring自帶的工具DigestUtils實現
org.springframework.util.DigestUtils
DigestUtils.md5DigestAsHex("1234".getBytes())
2 使用方法:
@Test public void testMd5() throws NoSuchAlgorithmException{ MessageDigest md = MessageDigest.getInstance("MD5"); // java自帶工具包MessageDigest String resultString = MD5Utils.md5("123456"); System.out.println(resultString); // e10adc3949ba59abbe56e057f20f883e String resultString1 = MD5Utils.md5("1234"); System.out.println(resultString1); //81dc9bdb52d04dc20036dbd8313ed055 // spring自帶工具包DigestUtils System.out.println(DigestUtils.md5DigestAsHex("1234".getBytes())); // 81dc9bdb52d04dc20036dbd8313ed055 }