解释
HmacSHA1,我的前端js加密后和后端java加密后加密串不一致,也不知道啥原因。经过一系列尝试,最后前端用crypto里的加密才和后端的保持一致,个人理解是CryptoJS里的hmac加密默认【二进制转文本】使用的是hex方式,然后crypto提供了base64的方式,用完后发现和后端加密的串是一致的
jsHmacSHA1加密
https://blog.youkuaiyun.com/qq_35459724/article/details/109391887
具体digest可以选那些,点进去方法看源码是这几个
import crypto from 'crypto'
let Base64 = require('js-base64').Base64 // 引入
const secretKey = 'nQwZz9W14snhN3Q5QjhzcJzXjna8B3kzLyNpIyOl7SEFSD5D0ugCug6JwarEqELY'
export default {
hmacEnc: function(message,key) {
// const CryptoJS = require('crypto-js');
// let message = '你的行为和表现还是让我无法完全相信你放下了'
// let key = '小太阳小月亮'
const encrypt = crypto.createHmac('sha1', key).update(message).digest('base64');
console.log(encrypt);
return encrypt;
},hmacEncNoKey: function(message) {
// const CryptoJS = require('crypto-js');
// let message = '你的行为和表现还是让我无法完全相信你放下了'
// let key = '小太阳小月亮'
const encrypt = crypto.createHmac('sha1', secretKey).update(message).digest('base64');
console.log(encrypt);
return encrypt;
},
}
java代码
和普通的javahamc加密代码是一样的
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
* HMAC_SHA1 Sign生成器.
*
* 需要apache.commons.codec包
*
*/
public class testHamc {
private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";
/**
* 使用 HMAC-SHA1 签名方法对data进行签名
*
* @param data
* 被签名的字符串
* @param key
* 密钥
* @return
加密后的字符串
*/
public static String genHMAC(String data, String key) {
byte[] result = null;
try {
//根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
SecretKeySpec signinKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);
//生成一个指定 Mac 算法 的 Mac 对象
Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
//用给定密钥初始化 Mac 对象
mac.init(signinKey);
//完成 Mac 操作
byte[] rawHmac = mac.doFinal(data.getBytes());
result = Base64.encodeBase64(rawHmac);
} catch (NoSuchAlgorithmException e) {
System.err.println(e.getMessage());
} catch (InvalidKeyException e) {
System.err.println(e.getMessage());
}
if (null != result) {
return new String(result);
} else {
return null;
}
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
String genHMAC = genHMAC("你的行为和表现还是让我无法完全相信你放下了", "小太阳小月亮");
System.out.println(genHMAC.length()); //28
System.out.println(genHMAC); // O5fviq3DGCB5NrHcl/JP6+xxF6s=
}
}