如何在Python中创建sha1哈希

问题描述 投票:0回答:2

我的目标是在Python中使用智能卡执行“哈希签名”。使用了 hashlib,但 python 中没有特定的 SHA1 或 SHA256 函数。 我的工作:

hash_object = hashlib.sha1(b'HelWorld')
pbHash = hash_object.hexdigest()

但是我得到的哈希对象的长度是28,而不是我应该得到14或20,这样我就可以切换条件为

 switch ( dwHashLen )
{
case 0x14: // SHA1 hash
             call scard transmit
case 0x20: // SHA256 hash
}

如有任何帮助,我们将不胜感激。先谢谢你了

python smartcard apdu pyscard
2个回答
46
投票

您实际上得到了 40,十六进制表示为

0x28
。将十六进制哈希值解码为 ASCII,如下所示

>>> import hashlib
>>> hash_object = hashlib.sha1(b'HelWorld')
>>> pbHash = hash_object.hexdigest()
>>> length = len(pbHash.decode("hex"))
>>> print length
20

或者按照

Dan D
的建议,简单地使用
digest
代替hexdigest


0
投票

阿卜杜勒·法蒂尔给出的答案对我不起作用:

AttributeError:“str”对象没有属性“decode”。您的意思是:“编码”吗?

这就是我如何使用 Python 3.12

hashlib
来评估 Wikipedia 中的 SHA1 示例哈希值

import hashlib


# SHA1 hex digest for some input string
def SHA1(msg: str) -> str:
    return hashlib.sha1(msg.encode()).hexdigest()


assert (
    SHA1("The quick brown fox jumps over the lazy dog")
    == "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12"
)
assert (
    SHA1("The quick brown fox jumps over the lazy cog")
    == "de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3"
)
assert SHA1("") == "da39a3ee5e6b4b0d3255bfef95601890afd80709"

我们可以观察到,每个摘要包含 40 个十六进制数字,相当于预期的 20 个字节的二进制数据(或 160 位)。

© www.soinside.com 2019 - 2024. All rights reserved.