Ruby生成的SHA-256哈希值与Python生成的哈希值不同

5

我正在使用Python中的hashlib库和Ruby中的Digest::SHA256.hexdigest库。

在Python中,我尝试了以下操作:

import hashlib
hasher = hashlib.sha256()
hasher.update("xyz")
hasher.digest()
hash = hasher.hexdigest()
print hash

输出结果:3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282

我尝试使用Ruby语言,

require 'digest'
hasher   = Digest::SHA256.digest "xyz"
hash   = Digest::SHA256.hexdigest(hasher)

输出: "18cefdae0f25ad7bb5f3934634513e54e5ac56d9891eb13ce456d3eb1f3e72e8"

有人能帮我理解为什么会有差异吗?我该如何获得与Python相同的值?

2个回答

11

你所需的Ruby代码只是:

require 'digest'
hash   = Digest::SHA256.hexdigest("xyz")

hexdigest接受需要摘要的字符串作为参数,因此您之前的代码所做的就是将字符串进行摘要(返回32个字节的原始数组),然后计算该数组的SHA256并将其格式化为64个十六进制字符。

Ruby摘要库也有类似于您Python示例的API:

hash = Digest::SHA256.new
hash.update 'xyz'
hash.hexdigest

当您需要逐步计算哈希值时


4
我使用以下代码得到了相同的结果:

Python 3.5.0:

import hashlib
>>> hashlib.sha256("xyz".encode()).hexdigest()
'3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282'

Ruby 2.2.3

require 'digest'

Digest::SHA256.hexdigest("xyz")
# => "3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282"

OR

H = Digest::SHA256.new
# => #<Digest::SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855>
H << "xyz"
# => #<Digest::SHA256: 3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282>
H.hexdigest
# => "3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282"

问题在于(据我看来):
hasher = Digest::SHA256.digest("xyz")
# => "6\b\xBC\xA1\xE4N\xA6\xC4\xD2h\xEBm\xB0\"`&\x98\x92\xC0\xB4+\x86\xBB\xF1\xE7zo\xA1l<\x92\x82"`

不是"xyz:"(免责声明:我以前几乎没有使用过Ruby)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接