閱讀175 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go CSDN廣州地區2010.05.30腐敗會策劃進行時,同時歡迎來自哈爾濱的yizia大版主
  下一篇:go magento開發 -- 去掉賬單地址的思路簡單描述