(有相当多的相当相似的帖子——我读过它们,解决方案主要是关于 Python 字符串编码,我认为我已经控制了但显然仍然没有)我正在尝试将 NPM 包移植到 Python,但我无法从每个脚本中获得相同的结果。我已将其简化为:import sysimport hashlibfrom binascii import hexlifyprint("Python", sys.version)test1 = "abcdefg".encode("utf-8")print(hexlify(test1), hashlib.sha256(test1).hexdigest())test2 = "abcdefg".encode("latin1")print(hexlify(test2), hashlib.sha256(test2).hexdigest())test3 = "abcdefg".encode("ascii")print(hexlify(test3), hashlib.sha256(test3).hexdigest())test4 = b"abcdefg"print(hexlify(test4), hashlib.sha256(test4).hexdigest())test5 = bytes([0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67])print(hexlify(test5), hashlib.sha256(test5).hexdigest())var js_sha3 = require('js-sha3')var crypto = require('crypto');var buffer = require('buffer');console.log("Javascript:", process.version)function toHex(str) { return new Buffer.from(str).toString('hex')}var test1 = "abcdefg"console.log(toHex(test1).toString('hex'), js_sha3.sha3_256(test1))var test2 = Buffer.from("abcdefg")console.log(toHex(test2), js_sha3.sha3_256(test2))var test3 = "abcdefg"console.log(toHex(test3), crypto.createHash('sha3-256').update(test3).digest("hex"))var test4 = Buffer.from("abcdefg")console.log(toHex(test4), crypto.createHash('sha3-256').update(test4).digest("hex"))var test5 = buffer.Buffer.from("abcdefg", 'hex')console.log(toHex(test5), js_sha3.sha3_256(test5))但是,进入abcdefghttps://emn178.github.io/online-tools/sha256.html *(由 支持js-sha3)返回7d1a54....所以,我的问题是——我在 Javascript 和 Python 中对 SHA-256 的使用有何不同?我错过了什么?(我不会试图声称其中一个实现被破坏了!)
2 回答
holdtom
TA贡献1805条经验 获得超10个赞
对于相同的给定输入,哈希函数产生相同的摘要当然是正确的。然而,棘手的地方在于,许多散列函数以字节为单位接受输入。这意味着这里将给定字符串编码为不同的编码取决于平台。但是,您还需要考虑到不同的编程语言可能会有细微的差异,例如我不熟悉 python,但它可能会在输入末尾添加一个空格和/或使用不同的 Unicode 表示不同的特殊字符。即使输入中的一个字节变化也会产生完全不同的输出,正如人们可能期望从散列函数中所期望的那样。
总而言之,如果您想找出创建不同哈希的原因,您应该对哈希函数的输入进行二进制比较。或者以十六进制或基数 64 打印 SHA-256 的输入。
添加回答
举报
0/150
提交
取消