尝试将SHA-1摘要从Python移植到浏览器JavaScript的不同结果
主要问题 我有下面一小段遗留代码,我正试图将其从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
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)
问题是,它们产生了两种完全不同的结果,我不知道为什么:
-Pythoncc47e3c0aa0c2984454476d06108c0b110177ae
-JavaScripta9993e364706816aba3e25717850c26c9cd0d89d
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上运行,而无需外部依赖性非常感谢!!这就解释了我想知道的一切:)祝你今天愉快。