第四章 消息摘要算法--SHA

注意:本節內容主要參考自《Java加密與解密的藝術(第2版)》第6章「驗證數據完整性--消息摘要算法」java

4.一、SHA算法

原理:消息摘要長度(能夠定量爲加密後的字符串的長度)越長,安全性越高spring

  • MD5:128位二進制摘要(32位16進制字符串)(已破解)
  • SHA1:160位二進制摘要(40位16進制字符串)(已破解)
  • SHA256:256位二進制摘要(64位16進制字符串)(經常使用,在spring security中也有使用到)

實現方式:apache

  • Commons Codec(「CC」,最推薦,由於封裝了JDK的底層代碼,而且提供了二進制字節數組向十六進制轉化的方法)
  • JDK(沒有提供二進制字節數組向十六進制轉化的方法,想要進行轉化,須要藉助BC)
  • Bouncy Castle(「BC」,不推薦,實現比較複雜)

下邊只列出基於CC的工具類代碼,至於基於JDK的代碼能夠參考「《Java加密與解密的藝術(第2版)》」,基於BC的代碼可參考「慕課網」數組

4.1.一、基於CC的SHA加密算法安全

 1 package com.util.sha;
 2 
 3 import java.io.UnsupportedEncodingException;
 4 import java.security.NoSuchAlgorithmException;
 5 import org.apache.commons.codec.digest.DigestUtils;
 6 /**
 7  * 基於Commons Codec的SHA算法
 8  */
 9 public class SHACC {
10     private static final String ENCODING = "UTF-8";
11     
12     /**
13      * SHA加密,加密後的結果爲二進制字節數組
14      */
15     public static byte[] encode(String data) throws NoSuchAlgorithmException,UnsupportedEncodingException {
16         //return DigestUtils.sha1(data.getBytes(ENCODING));//SHA-1
17         return DigestUtils.sha256(data.getBytes(ENCODING));//SHA-256
18     }
19     
20     /**
21      *SHA加密,加密後的結果爲二進制字節數組,而且在這裏將二進制字節數組轉爲了16進制字符串
22      */
23     public static String encodeSHAHex(String data) throws NoSuchAlgorithmException,UnsupportedEncodingException {
24         //return new String(DigestUtils.sha1Hex(data.getBytes(ENCODING)));
25         return new String(DigestUtils.sha256Hex(data.getBytes(ENCODING)));
26     }
27     
28     /**
29      * 測試
30      * @param args
31      * @throws UnsupportedEncodingException 
32      * @throws NoSuchAlgorithmException 
33      */
34     public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException {
35         
36         String data = "找一個好姑娘作老婆是個人夢 想!";
37         /*************測試encode()**************/
38         System.out.println("原文-->"+data);
39         byte[] encodedByte = SHACC.encode(data);
40         System.out.println("加密後-->"+encodedByte);
41         byte[] encodedByte2 = SHACC.encode(data);
42         System.out.println("加密後-->"+encodedByte2);
43         for(int i=0;i<encodedByte.length;i++){
44             System.out.println(encodedByte[i]==encodedByte2[i]);
45         }
46         /*************測試encodeSHAHex()**************/
47         System.out.println("原文-->"+data);
48         String encodedStr = SHACC.encodeSHAHex(data);
49         System.out.println("加密後-->"+encodedStr);
50         String encodedStr2 = SHACC.encodeSHAHex(data);
51         System.out.println("加密後-->"+encodedStr2);
52         System.out.println(encodedStr.equals(encodedStr2));
53     }
54 }
View Code

在咱們須要採用相應的sha算法的時候,只需選用不一樣的函數便可(具體查詢Commons Codec的API便可,連接在第五章末尾)。ide

jar包的引入參考第二章的第一個例子進行便可,在測試的過程當中,本身去試着看看「同一個消息屢次進行SHA加密後結果是否是相同」;函數

在encode()方法的測試中判斷兩個byte[]是否相等:按索引依次比較兩個字節數組中的元素是否相同便可(若是使用main方法去測的話);若是使用Junit,直接使用assertArrayEquals(array1,array2)便可。工具

相關文章
相關標籤/搜索