我們知道,編程中資料的傳輸,儲存,為了考慮安全性的問題,需要將資料進行加密.我們拿資料庫做例子.如果一個使用者註冊系統的資料庫,沒有對使用者的資訊進行儲存,如,我去頁面註冊,輸入"Vicky","123456".註冊.web伺服器未對資料進行加密而直接寫入資料庫,那麼資料庫中的使用者資訊,便是一個直接可用的資料!一旦伺服器伺服器被黑~那麼使用者的資訊將毫無保留的展現在駭客面前...為瞭解決這個弊端,現在大多數都會將資訊進行MD5加密.如"Vicky"與"123456"加密後,會產生16位或者32位字串.而駭客即便獲得這些資料也無法使用...
MD5是常用的加密方法,這裡主要講述JDK中的java.security.MessageDigest加密方式!
@Test<br />public void testMD() {<br />try {<br />String username = "Vicky";<br />MessageDigest messageDigest = MessageDigest.getInstance("MD5");<br />messageDigest.update(username.getBytes());<br />String usernameMD5 = messageDigest.digest().toString();<br />System.out.println(usernameMD5);<br />} catch (Exception e) {<br />e.printStackTrace();<br />}<br />} 列印的是:[B@107077e,這是因為輸出的是byte[](messageDigest.digest()得到的是個二進位byte數組,有可能某些byte是不可列印的字元。)...我們可以使用Base64來處理byte[]
@Test<br />public void testMD() {<br />try {<br />String username = "Vicky";<br />MessageDigest messageDigest = MessageDigest.getInstance("MD5");<br />messageDigest.update(username.getBytes());<br />System.out.println(Base64.encode(messageDigest.digest()));<br />} catch (Exception e) {<br />e.printStackTrace();<br />}<br />}
列印的是:AgwpBZPO+ErqxOosJp0ybQ==
當然我們可以編寫函數,處理二進位轉hex字串.
如:
/**<br /> * 將16位byte[] 轉換為32位String<br /> *<br /> * @param buffer<br /> * @return<br /> */<br />private String toHex(byte buffer[]) {<br />StringBuffer sb = new StringBuffer(buffer.length * 2);<br />for (int i = 0; i < buffer.length; i++) {<br />sb.append(Character.forDigit((buffer[i] & 240) >> 4, 16));<br />sb.append(Character.forDigit(buffer[i] & 15, 16));<br />}</p><p>return sb.toString();<br />}
編寫測試語句
@Test<br />public void testMD() {<br />try {</p><p>String username = "Vicky";<br />MessageDigest messageDigest = MessageDigest.getInstance("MD5");<br />messageDigest.update(username.getBytes());<br />System.out.println(toHex(messageDigest.digest()));<br />} catch (Exception e) {<br />e.printStackTrace();<br />}<br />}
列印:020c290593cef84aeac4ea2c269d326d,返回的是32位的字串!!!
這樣我們便可以直接使用JDK為我們提供的加密類與函數了!
MessageDigest不僅僅只為我們提供了"MD5"加密,還提供了"SHA-1"
建立的方法只為: MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
MD5與SHA-1的區別為:MD5是16位,SHA是20位(這是兩種報文摘要的演算法)
難道 MessageDigest 只能用作資料加密嗎?如何使用MessageDigest產生安全性權杖!!!