(有相當多的相當相似的帖子——我讀過它們,解決方案主要是關于 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 表示不同的特殊字符。即使輸入中的一個字節變化也會產生完全不同的輸出,正如人們可能期望從散列函數中所期望的那樣。
總而言之,如果您想找出創建不同哈希的原因,您應該對哈希函數的輸入進行二進制比較?;蛘咭允M制或基數 64 打印 SHA-256 的輸入。
添加回答
舉報
0/150
提交
取消
