![](/img/trans.png)
[英]Convert HMAC-SHA384 function from Java to JavaScript
[英]Calculating HMAC in JavaScript : converting from Java
我在Java中有一个加密功能,试图将其转换为Javascript,由于某种原因,最终生成的哈希值不相同。
我正在为Javascript使用加密货币,为Java而使用Mac。
Javascript :
const time = 0,0,0,0,0,8,21,60;
const signKey = 20,54,50,82;
const hash = crypto
.createHmac('sha1', new Buffer(signKey, 'base64'))
.update(new Buffer(time))
.digest('hex');
console.log(`hash ${hash}`);
Java的 :
byte[] time = 0,0,0,0,0,8,21,60;
byte[] signKey = 20,54,50,82;
SecretKeySpec signKey = new SecretKeySpec(signKey, "HmacSHA1");
Mac mac;
mac = Mac.getInstance("HmacSHA1");
mac.init(signKey);
byte[] hash = mac.doFinal(time);
Javascript-输出 :
hash = 52,56,48
Java-输出 : hash = [-47, 30, -1]
我想我缺少在Javascript中进行某些转换的方法,但是由于我不熟悉加密技术,因此我不确定。
谢谢 !
正如我在JS中看到的那样,您将signKey视为base64编码的字符串,而在Java中则将其视为字节数组。 因此,从JS代码中删除'base64'应该会有所帮助。
嗨,我设法找到了解决方案,所以是的,确实的一件事是从JS代码中删除了base64和Buffers,而且我应该摘要而不将其转换为十六进制。
由于我删除了缓冲区,由于加密仅接受缓冲区,TypedArrays,String和DataViews,所以我不得不将两个数组都转换为TypedArrays。
之后,我应该将哈希转换为Unit32Array,并且应该与Java代码中的哈希相同
因此,最后的代码是:
const timeInBytes = 0,0,0,0,0,8,21,60;
const combinedSecret = 20,54,50,82;
const signKey = Uint8Array.from(combinedSecret);
const time = Uint8Array.from(timeInBytes);
const hash = crypto
.createHmac('sha1', signKey)
.update(time)
.digest();
const encodedArray = Uint32Array.from(hash);
感谢大伙们 !
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.