Javascript和Python中的散列之间的区别

(有相当多的相当相似的帖子——我读过它们,解决方案主要是关于 Python 字符串编码,我认为我已经控制了但显然仍然没有)


我正在尝试将 NPM 包移植到 Python,但我无法从每个脚本中获得相同的结果。我已将其简化为:


import sys

import hashlib

from binascii import hexlify

print("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 的使用有何不同?我错过了什么?(我不会试图声称其中一个实现被破坏了!)


长风秋雁
浏览 85回答 2
2回答

holdtom

对于相同的给定输入,哈希函数产生相同的摘要当然是正确的。然而,棘手的地方在于,许多散列函数以字节为单位接受输入。这意味着这里将给定字符串编码为不同的编码取决于平台。但是,您还需要考虑到不同的编程语言可能会有细微的差异,例如我不熟悉 python,但它可能会在输入末尾添加一个空格和/或使用不同的 Unicode 表示不同的特殊字符。即使输入中的一个字节变化也会产生完全不同的输出,正如人们可能期望从散列函数中所期望的那样。总而言之,如果您想找出创建不同哈希的原因,您应该对哈希函数的输入进行二进制比较。或者以十六进制或基数 64 打印 SHA-256 的输入。

牛魔王的故事

sha256今天我了解了和之间非常重要的区别sha3-256。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python