将自定义消息身份验证代码从Java转换为JavaScript
Converting custom message authentication code from Java to JavaScript
这是java代码。我试图在javascript复制相同的功能。
public String populateHMAC(String app_id, String mobile, String token,
String deviceId) {
String hmac = null;
try {
CryptLib cryptLib = new CryptLib();
String message = app_id + "|" + mobile + "|" + deviceId;
byte[] tokenBytes = Base64.decode(token, 2);//cryptLib.hexStringToByteArray(token);
String temp=Base64.encodeToString(cryptLib.SHA256(message),2);
byte[] tempArr=Base64.decode(temp,2);
byte[] hmacBytes = cryptLib.encrypt(
cryptLib.SHA256(message),
tokenBytes);
hmac = Base64.encodeToString(hmacBytes, Base64.DEFAULT);
} catch (Exception e) {
e.printStackTrace();
}
return hmac;
}
这些是CryptLib
内部的函数public byte[] SHA256(String paramString) throws Exception {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(paramString.getBytes("UTF-8"));
byte[] digest = md.digest();
return digest;
}
和加密函数
public byte[] encrypt(byte[] data, byte[] key) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
byte[] iv = new byte[16];
IvParameterSpec ivSpec = new IvParameterSpec(iv);
Cipher acipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] arrayOfByte1;
acipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
arrayOfByte1 = acipher.doFinal(data);
return arrayOfByte1;
}
这是相同功能的javascript代码。我正在使用crypto-js库。
var crypto = require('crypto-js');
populateHMAC( app_id, mobile, token, deviceId){
var rawStr = token;
var wordArray = crypto.enc.Utf8.parse(rawStr);
var base64 = crypto.enc.Base64.stringify(wordArray);
var enctoken=btoa(token);
var message= app_id + "|" + mobile + "|" + deviceId;
var decodedString= atob(enctoken);
message=encodeURIComponent(message);
var hash= crypto.SHA256(message);//.toString(crypto.enc.Utf8);
console.log("params",decodedString,hash.toString(crypto.enc.Hex));
var iv = crypto.enc.Hex.parse('0000000000000000');
var encryptedString = crypto.AES.encrypt(hash, decodedString, {
iv:iv,
mode: crypto.mode.CBC,
padding: crypto.pad.Pkcs7
});
var encodedString= encryptedString.ciphertext.toString(crypto.enc.Base64);
return encodedString;
}
两个输出是不同的,我不知道为什么。
问题:
-
我没有看到在Java代码中使用等价的
encodeURIComponent
。 -
decodedString
是一个"二进制"字符串,CryptoJS将其视为密码。实际上,您需要将令牌转换为CryptoJS能够理解的二进制表示:var decodedString = crypto.enc.Base64.parse(token);
删除代码开头的其他编码和解码步骤
-
'0000000000000000'
太短,如果它应该是十六进制编码的IV.它必须是两倍长的16字节(32十六进制)。
相关文章:
- 使用键/代码转换JavaScript数组
- NS_ERROR_XPC_BAD_CONVERT_JS:无法转换JavaScript参数arg 0[nsIDOMWind
- 转换Javascript中的DayOfYear值以用于Flot
- 转换Javascript日期格式
- 字符串大小写转换 javascript
- 一个很好的文本到语音转换JavaScript库
- JQuery 函数突然停止工作,转换 Javascript 参数时出错
- 转换 JavaScript 代码
- 需要转换Javascript数组的格式
- 转换javascript中的日期格式
- 循环以转换JavaScript对象
- jQuery Post中的错误:无法转换JavaScript参数
- UglifyJS转换javascript代码
- Html到Haml的转换javascript
- 正在转换Javascript日期
- 转换Javascript关联对象并用PHP输出
- 转换JavaScript'这'到jQuery'$(这个)'
- 转换JavaScript数组
- 无法转换JavaScript参数arg 0 [nsIDOMWindow.getComputedStyle]
- jQuery美元.Firefox中的ajax错误:"无法转换JavaScript参数"