這是項目中給大家的WorkShop,在此備份。
HMAC(Hash Message Authentication Code,散列消息鑑別碼,基於密鑰的Hash算法的認證協議。 * 消息鑑別碼實現鑑別的原理是,用公開函數和密鑰產生一個固定長度的值作爲認證標識,用這個標識鑑別消息的完整性。 * 使用一個密鑰生成一個固定大小的小數據塊,即MAC,並將其加入到消息中,然後傳輸。 * 接收方利用與發送方共享的密鑰進行鑑別認證等
import org.bouncycastle.util.encoders.Hex; import javax.crypto.KeyGenerator; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; /** * MAC算法. * * @author [email protected] * @version 1.0 * @date 2018-09-09 */ public class MACUtils { /** * 產生密鑰兩種方式 1)是由jdk自己來產生的,2)我們可以自己指定一個字節數組 * 注意:密鑰是以二進制字節數組存儲的 */ public static byte[] getKey() throws NoSuchAlgorithmException{ //指定具體算法HmacMD5,HmacSHA1,HmacSHA256 SecretKey key = KeyGenerator.getInstance("HmacMD5").generateKey(); return key.getEncoded(); } /** * HmacMD5加密 * @param data 帶加密數據 * @param keyByte 密鑰 */ public static byte[] encode(String data, byte[] keyByte) throws NoSuchAlgorithmException, InvalidKeyException, IllegalStateException, UnsupportedEncodingException { //還原密鑰 SecretKey key = new SecretKeySpec(keyByte, "HmacMD5"); Mac mac = Mac.getInstance(key.getAlgorithm()); //爲mac實例初始化密鑰 mac.init(key); return mac.doFinal(data.getBytes("UTF-8")); } /** * HmacMD5加密,並轉爲16進制 */ public static String encodeHmacMD5Hex(String data, byte[] keyByte) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException, IllegalStateException { byte[] encodedByte = encode(data, keyByte); //藉助BC return new String(Hex.encode(encodedByte)); //藉助CC //return new String(org.apache.commons.codec.binary.Hex.encodeHexString(encodedByte)); } /** * 測試 */ public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException, IllegalStateException { String data = "不上班也發薪水是我的夢想!"; //測試 encode() System.out.println("原文-->"+data); byte[] keyByte = MACUtils.getKey(); byte[] encodedByte = MACUtils.encode(data, keyByte); System.out.println("加密後-->"+encodedByte); byte[] encodedByte2 = MACUtils.encode(data, keyByte); System.out.println("加密後-->"+encodedByte2); for(int i=0;i<encodedByte.length;i++){ System.out.println(encodedByte[i]==encodedByte2[i]); } //測試 encodeHmacMD5Hex() System.out.println("原文-->"+data); String encodedStr = MACUtils.encodeHmacMD5Hex(data, keyByte); System.out.println("加密後-->"+encodedStr); String encodedStr2 = MACUtils.encodeHmacMD5Hex(data, keyByte); System.out.println("加密後-->"+encodedStr2); System.out.println(encodedStr.equals(encodedStr2)); } }