注意:本節內容主要參考自《Java加密與解密的藝術(第2版)》第6章「驗證數據完整性--消息摘要算法」java
4.一、SHA算法
原理:消息摘要長度(能夠定量爲加密後的字符串的長度)越長,安全性越高spring
實現方式:apache
下邊只列出基於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 }
在咱們須要採用相應的sha算法的時候,只需選用不一樣的函數便可(具體查詢Commons Codec的API便可,連接在第五章末尾)。ide
jar包的引入參考第二章的第一個例子進行便可,在測試的過程當中,本身去試着看看「同一個消息屢次進行SHA加密後結果是否是相同」;函數
在encode()方法的測試中判斷兩個byte[]是否相等:按索引依次比較兩個字節數組中的元素是否相同便可(若是使用main方法去測的話);若是使用Junit,直接使用assertArrayEquals(array1,array2)便可。工具