java.security.MessageDigest的使用(1)!
我們知道,編程中數據的傳輸,保存,為了考慮安全性的問題,需要將數據進行加密.我們拿數據庫做例子.如果一個用戶注冊係統的數據庫,沒有對用戶的信息進行保存,如,我去頁麵注冊,輸入"Vicky","123456".注冊.web服務器未對數據進行加密而直接寫入數據庫,那麼數據庫中的用戶信息,便是一個直接可用的數據!一旦服務器服務器被黑~那麼用戶的信息將毫無保留的展現在黑客麵前...為了解決這個弊端,現在大多數都會將信息進行MD5加密.如"Vicky"與"123456"加密後,會生成16位或者32位字符串.而黑客即便獲得這些數據也無法使用...
MD5是常用的加密方法,這裏主要講述JDK中的java.security.MessageDigest加密方式!
view plaincopy to clipboardprint?
@Test
public void testMD() {
try {
String username = "Vicky";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(username.getBytes());
String usernameMD5 = messageDigest.digest().toString();
System.out.println(usernameMD5);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testMD() {
try {
String username = "Vicky";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(username.getBytes());
String usernameMD5 = messageDigest.digest().toString();
System.out.println(usernameMD5);
} catch (Exception e) {
e.printStackTrace();
}
} 打印的是:[B@107077e,這是因為輸出的是byte[](messageDigest.digest()得到的是個二進製byte數組,有可能某些byte是不可打印的字符。)...我們可以使用Base64來處理byte[]
view plaincopy to clipboardprint?
@Test
public void testMD() {
try {
String username = "Vicky";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(username.getBytes());
System.out.println(Base64.encode(messageDigest.digest()));
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testMD() {
try {
String username = "Vicky";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(username.getBytes());
System.out.println(Base64.encode(messageDigest.digest()));
} catch (Exception e) {
e.printStackTrace();
}
}
打印的是:AgwpBZPO+ErqxOosJp0ybQ==
當然我們可以編寫函數,處理二進製轉hex字符串.
如:
view plaincopy to clipboardprint?
/**
* 將16位byte[] 轉換為32位String
*
* @param buffer
* @return
*/
private String toHex(byte buffer[]) {
StringBuffer sb = new StringBuffer(buffer.length * 2);
for (int i = 0; i < buffer.length; i++) {
sb.append(Character.forDigit((buffer[i] & 240) >> 4, 16));
sb.append(Character.forDigit(buffer[i] & 15, 16));
}
return sb.toString();
}
/**
* 將16位byte[] 轉換為32位String
*
* @param buffer
* @return
*/
private String toHex(byte buffer[]) {
StringBuffer sb = new StringBuffer(buffer.length * 2);
for (int i = 0; i < buffer.length; i++) {
sb.append(Character.forDigit((buffer[i] & 240) >> 4, 16));
sb.append(Character.forDigit(buffer[i] & 15, 16));
}
return sb.toString();
}
編寫測試語句
view plaincopy to clipboardprint?
@Test
public void testMD() {
try {
String username = "Vicky";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(username.getBytes());
System.out.println(toHex(messageDigest.digest()));
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testMD() {
try {
String username = "Vicky";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(username.getBytes());
System.out.println(toHex(messageDigest.digest()));
} catch (Exception e) {
e.printStackTrace();
}
}
打印:020c290593cef84aeac4ea2c269d326d,返回的是32位的字符串!!!
這樣我們便可以直接使用JDK為我們提供的加密類與函數了!
MessageDigest不僅僅隻為我們提供了"MD5"加密,還提供了"SHA-1"
創建的方法隻為: MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
MD5與SHA-1的區別為:MD5是16位,SHA是20位(這是兩種報文摘要的算法)
難道 MessageDigest 隻能用作數據加密嗎?如何使用MessageDigest生成安全令牌!!!
本文來自CSDN博客,轉載請標明出處:https://blog.csdn.net/eclipser1987/archive/2010/01/08/5158784.aspx
最後更新:2017-04-02 05:21:05