尝试将SHA-1摘要从Python移植到浏览器JavaScript的不同结果

尝试将SHA-1摘要从Python移植到浏览器JavaScript的不同结果,javascript,python,cryptography,sha1,Javascript,Python,Cryptography,Sha1,主要问题 我有下面一小段遗留代码,我正试图将其从Python(仅使用标准库)移植到JavaScript——从方法的名称,我假设它创建了abc字符串的SHA-1摘要 导入hashlib 进口hmac 打印(hmac.new(b“abc”,None,hashlib.sha1.hexdigest()) 我在JS的浏览器中搜索了如何做到这一点,并找到了 var msgUint8=new textcoder().encode('abc'); var hashBuffer=await crypto.min

主要问题

我有下面一小段遗留代码,我正试图将其从Python(仅使用标准库)移植到JavaScript——从方法的名称,我假设它创建了
abc
字符串的SHA-1摘要

导入hashlib
进口hmac
打印(hmac.new(b“abc”,None,hashlib.sha1.hexdigest())
我在JS的浏览器中搜索了如何做到这一点,并找到了

var msgUint8=new textcoder().encode('abc');
var hashBuffer=await crypto.minute.digest('SHA-1',msgUint8);
var hashArray=Array.from(新的Uint8Array(hashBuffer));
var hashHex=hashArray.map(b=>b.toString(16).padStart(2,'0')).join(“”);
console.log(hashHex)
问题是,它们产生了两种完全不同的结果,我不知道为什么:

  • cc47e3c0aa0c2984454476d06108c0b110177ae
    -Python
  • a9993e364706816aba3e25717850c26c9cd0d89d
    -JavaScript
我尝试将
b“abc”
的字节与
new textcoder()进行比较。encode('abc')
返回的字节完全相同:
0x61 0x62 0x63
,因此问题出在其他地方,我不知道在哪里

我需要JavaScript代码返回Python代码返回的内容。有什么想法吗


另外

我的最终目标是实际移植此代码(注意
b“hello”
而不是
None
):


因此,如果你对这一点也有想法,我将非常感激

Python代码计算基于SHA1的HMAC。另一方面,JavaScript代码计算SHA-1哈希。除数据外,a还需要一个键,而a在没有键的情况下工作

第一个Python代码使用键
abc
和一条空消息。HMAC的发布结果是十六进制编码的:

cc47e3c0aa0c2984454476d061108c0b110177ae
d373670db3c99ebfa96060e993c340ccf6dd079e
第二个Python代码使用相同的键和消息
hello
。HMAC的结果是十六进制编码的:

cc47e3c0aa0c2984454476d061108c0b110177ae
d373670db3c99ebfa96060e993c340ccf6dd079e
Java代码确定
abc
的SHA-1哈希值。结果是

a9993e364706816aba3e25717850c26c9cd0d89d
因此,所有结果都是正确的,但都是使用不同的输入数据或算法生成的


HMAC的计算可通过本机浏览器实现,如下所示:

(异步()=>{
var hmac=wait calcHMac('abc','hello');
log('HMAC:',buf2hex(HMAC));
var hmac=等待calcHMac('abc','');
log('HMAC:',buf2hex(HMAC));
})();
异步函数calcHMac(rawkey,data){
var key=await window.crypto.minute.importKey('raw',utf8Encode(rawkey),{name:'HMAC',hash:'SHA-1',true,['sign']);
var hmac=await window.crypto.minute.sign('hmac',key,utf8Encode(data));
返回hmac;
}
函数utf8Encode(str){
返回新的textcoder().encode(str);
}
函数buf2hex(缓冲区){
return Array.prototype.map.call(新的Uint8Array(buffer),x=>('00'+x.toString(16)).slice(-2)).join(“”);//from:https://stackoverflow.com/a/40031979/9014097 

}
可能会有帮助:您是否需要一个特定的库(因为您的示例使用WebCrypto),还是与使用哪个JavaScript库无关?@Topaco理想情况下,它可以在Firefox和Chrome上运行,而无需外部依赖性非常感谢!!这就解释了我想知道的一切:)祝你今天愉快。