【问题标题】:Difference between hashing in Javascript and PythonJavascript和Python中的散列之间的区别
【发布时间】:2020-05-27 05:41:57
【问题描述】:

(有相当多的相当相似的帖子 - 我已经阅读过它们,解决方案似乎主要是关于 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))

但是,输出看起来像这样:

Python 3.7.4 (default, Sep  7 2019, 18:27:02) 
[Clang 10.0.1 (clang-1001.0.46.4)]
b'61626364656667' 7d1a54127b222502f5b79b5fb0803061152a44f92b37e23c6527baf665d4da9a
b'61626364656667' 7d1a54127b222502f5b79b5fb0803061152a44f92b37e23c6527baf665d4da9a
b'61626364656667' 7d1a54127b222502f5b79b5fb0803061152a44f92b37e23c6527baf665d4da9a
b'61626364656667' 7d1a54127b222502f5b79b5fb0803061152a44f92b37e23c6527baf665d4da9a
b'61626364656667' 7d1a54127b222502f5b79b5fb0803061152a44f92b37e23c6527baf665d4da9a
Javascript: v12.15.0
61626364656667 7d55114476dfc6a2fbeaa10e221a8d0f32fc8f2efb69a6e878f4633366917a62
61626364656667 7d55114476dfc6a2fbeaa10e221a8d0f32fc8f2efb69a6e878f4633366917a62
61626364656667 7d55114476dfc6a2fbeaa10e221a8d0f32fc8f2efb69a6e878f4633366917a62
61626364656667 7d55114476dfc6a2fbeaa10e221a8d0f32fc8f2efb69a6e878f4633366917a62
abcdef 8b8a2a6bc589cd378fc57f47d5668c58b31167b2bf9e632696e5c2d50fc16002

但是,将abcdefg 输入https://emn178.github.io/online-tools/sha256.html *(由js-sha3 支持)返回7d1a54...

所以,我的问题是 - 我在 Javascript 和 Python 中对 SHA-256 的使用有何不同?我错过了什么? (我不会试图声称其中一个实现被破坏了!)

[编辑] 如果我使用 MD5 而不是 SHA-256,结果匹配,进一步增加了谜团!

x = bytes("thequickbrownfox", "utf-8")
print(hashlib.md5(x).hexdigest())
print(hashlib.sha256(x).hexdigest())
var x = "thequickbrownfox"
console.log(crypto.createHash('md5').update(x).digest("hex"))
console.log(crypto.createHash('sha3-256').update(x).digest("hex"))

输出:

308fb76dc4d730360ee33932d2fb1056
bd484b82d7875e115c7273e9c6102ca4946b7c55fe905012be9152b87fe09568
308fb76dc4d730360ee33932d2fb1056
4822316e0d7a7a2ce1bb6489e57c73ca5db4c7c660c79c3c65839bd4aaf4ef10

【问题讨论】:

    标签: javascript python hex sha


    【解决方案1】:

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

    总而言之,如果您想找出创建不同哈希的原因,您应该对哈希函数的输入进行二进制比较。或者以十六进制或基数 64 打印 SHA-256 的输入。

    【讨论】:

    • 这是一个很好的观点,尽管不幸的是这不是我的问题。我已经更新了我的问题以显示十六进制表示。
    【解决方案2】:

    今天我了解了sha256sha3-256 之间非常重要的区别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-01
      • 2010-10-03
      • 2010-09-24
      • 1970-01-01
      • 2016-11-06
      • 2010-10-19
      • 2010-10-06
      相关资源
      最近更新 更多