如何使用本机lib(即hashlib)在Python中迭代sha256,使用byte []作为输入而不是十六进制字符串

Rob*_*ian 2 python java hash hex sha256

背景:我需要从Python脚本和Java Web应用程序计算迭代哈希算法.

Psuedo代码:

hash = sha256(raw)
for x=1 to 64000 hash = sha256(hash)
Run Code Online (Sandbox Code Playgroud)

其中hash是长度为32的字节数组,而不是长度为64的十六进制字符串.

我希望以字节为单位的原因是因为尽管Python可以在每次迭代之间转换为十六进制字符串并且将处理时间保持在一秒之内,但Java需要3秒才能获得字符串开销.

所以,Java代码看起来像这样:

// hash one time...
byte[] result = sha256(raw.getBytes("UTF-8"));

// then hash 64k-1 more times
for (int x = 0; x < 64000-1; x++) {
  result = sha256(result);
}

// hex encode and print result
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb);
for (int i=0; i<buf.length; i++) {
  formatter.format("%02x", buf[i]);
}
System.out.println(sb.toString());
Run Code Online (Sandbox Code Playgroud)

Python代码如下所示:

import hashlib

# hash 1 time...
hasher = hashlib.sha256()
hasher.update(raw)
digest = hasher.digest()

# then hash 64k-1 times
for x in range (0, 64000-1):
  # expect digest is bytes and not hex string
  hasher.update(digest) 
  digest = hasher.digest()
print digest.encode("hex")
Run Code Online (Sandbox Code Playgroud)

Python结果计算了第一个摘要(String)的十六进制表示形式的散列,而不是原始摘要字节.所以,我得到了不同的输出.

Mic*_*ski 5

方法.update of hasher将参数附加到以前的文本(Python docs).相反,每次想要计算摘要时都应该创建新的哈希.

import hashlib

# hash 1 time...
digest = hashlib.sha256(raw).digest()

# then hash 64k-1 times
for x in range(0, 64000-1):
  digest = hashlib.sha256(digest).digest()
print digest.encode("hex")
Run Code Online (Sandbox Code Playgroud)