这是项目中给大家的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"+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)); } }