hashlib.sha512.digest()的输出有奇数字符

时间:2013-08-11 16:50:16

标签: python digest sha512

之前的问题被提出并且读者被要求使用hexdigest()代替。 ......这确实有效。但是摘要格式的结构是什么?

以下测试代码:

import hashlib, base64
f1 = open('foo.jpeg', 'rb')    
m = hashlib.sha512()
m.update(f1.read())
sha = m.digest()
print(m.digest())
print(m.hexdigest())
res = base64.b64encode(sha)
print( res)

产生以下输出:

>>> 
b'\xf3g\xd1S\xc4#OK\xb8\xb7\x1f~r\xf0\x19JE\xb0d\xb9\x11O\x08\x1c\xc66\x00\xb3i*\x87\x08\x92+\xd3)F\x02\t\x80\xf0m\x8b;\x9c\xcdq\xbd\xb9\x92k\x7f}d\t\xc65\x12\x0b\x17\xf9]5\x97'

f367d153c4234f4bb8b71f7e72f0194a45b064b9114f081cc63600b3692a8708922bd32946020980f06d8b3b9ccd71bdb9926b7f7d6409c635120b17f95d3597
>>> 

我没有得到像#34;#OK"," ~r"," i *"等于上面第一行的输出。任何可以解决这个问题的光都将非常感激。当然,hexdigest()输出非常有意义。

上一个问题是:hashlib.sha256在python中返回了一些奇怪的字符。 非常感谢。

2 个答案:

答案 0 :(得分:2)

像sha512这样的散列函数的输出是512位字符串或64字节字符串。因此m.digest的结果是长度为64的字节对象。输出是伪随机的,因此散列中的“#OK”纯粹是巧合。 m.hexdigest的输出是与十六进制数字相同的字节。

答案 1 :(得分:1)

正如python reference所述:

  

hash.digest()

     

返回到目前为止传递给update()方法的字符串的摘要。这是一个digest_size字节的字符串,可能包含非ASCII字符,包括空字节。

所以你看到的是你的摘要到目前为止的字节表示。

如果您查看ASCII chart,您会看到某些字节可以表示为可打印字符。例如,摘要中的第二个字节(十六进制67)对字符g进行编码,而第一个字节(十六进制f3)不能表示为可打印字符,因此打印出来为\xf3