Java 自帶的數據加密類MessageDigest(MD5或SHA加密)java
說明:git
在網站中,爲了保護網站會員的用戶名和密碼等隱私信息,因此咱們在用戶註冊時就直接進行MD5方式或其餘方式進行加密, 即便是數據庫管理員也不能查看該會員的密碼等信息,在數據庫中查看密碼效果如:8e830882f03b2cb84d1a657f346dd41a效果。算法
由於MD5算法是不可逆的,因此被不少網站普遍使用,數據庫
廣泛使用的三種加密方式數組
方式一:使用位運算符,將加密後的數據轉換成16進制緩存
方式二:使用格式化方式,將加密後的數據轉換成16進制(推薦)安全
方式三:使用算法,將加密後的數據轉換成16進制數據結構
輸出結果app
8e830882f03b2cb84d1a657f346dd41a 0ba5512371d00c86e91712f44aab7138 8E830882F03B2CB84D1A657F346DD41A 0BA5512371D00C86E91712F44AAB713898745F91 8e830882f03b2cb84d1a657f346dd41a 0ba5512371d00c86e91712f44aab713898745f91
咱們發現,3個方法執行效果相同,SHA長度要比MD5多出8個字符(32比特)ide
MessageDigest 類爲應用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的單向哈希函數,它接收任意大小的數據,並輸出固定長度的哈希值。
MessageDigest 對象開始被初始化。該對象經過使用 update()方法處理數據。任什麼時候候均可以調用 reset()方法重置摘要。一旦全部須要更新的數據都已經被更新了,應該調用digest() 方法之一完成哈希計算。
對於給定數量的更新數據,digest
方法只能被調用一次。在調用 digest
以後,MessageDigest 對象被從新設置成其初始狀態。
一、public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException
返回實現指定摘要算法的 MessageDigest 對象。
algorithm - 所請求算法的名稱
二、public static MessageDigest getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException
返回實現指定摘要算法的 MessageDigest 對象。
algorithm - 所請求算法的名稱
provider - 提供者的名稱。
三、public void update(byte[] input)
使用指定的 byte 數組更新摘要。
四、public byte[] digest()
經過執行諸如填充之類的最終操做完成哈希計算。在調用此方法以後,摘要被重置。
五、public static boolean isEqual(byte[] digesta, byte[] digestb)
注意:Provider能夠經過 Java.security.Security.getProviders()
方法獲取已註冊提供者列表。比較經常使用的有「SUN」
SUN提供的經常使用的算法名稱有:MD2 MD5 SHA-1 SHA-256 SHA-384 SHA-512
Code舉例:
import java.security.*; public class myDigest { public static void main(String[] args) { myDigest my=new myDigest(); my.testDigest(); } public void testDigest() { try { String myinfo="個人測試信息"; //java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5"); java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1"); alga.update(myinfo.getBytes()); byte[] digesta=alga.digest(); System.out.println("本信息摘要是:"+byte2hex(digesta)); //經過某中方式傳給其餘人你的信息(myinfo)和摘要(digesta) 對方能夠判斷是否更改或傳輸正常 java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1"); algb.update(myinfo.getBytes()); if (algb.isEqual(digesta,algb.digest())) { System.out.println("信息檢查正常"); } else { System.out.println("摘要不相同"); } } catch (java.security.NoSuchAlgorithmException ex) { System.out.println("非法摘要算法"); } } public String byte2hex(byte[] b) //二行制轉字符串 { String hs=""; String stmp=""; for (int n=0;n<b.length;n++) { stmp=(java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length()==1) hs=hs+"0"+stmp; else hs=hs+stmp; if (n<b.length-1) hs=hs+":"; } return hs.toUpperCase(); } }
關於Java加密的更多信息:<a target=_blank href="http://www.ibm.com/developerworks/cn/java/l-security/" style="color: rgb(51, 102, 153); text-decoration: none;">http://www.ibm.com/developerworks/cn/java/l-security/</a>