Python中的加密哈希函数

Posted

技术标签:

【中文标题】Python中的加密哈希函数【英文标题】:Cryptographic hash functions in Python 【发布时间】:2021-11-19 08:00:37 【问题描述】:

我正在用 Python 编写一个用于椭圆曲线密码学的程序(用于学校和出于兴趣)。我目前正在研究数字签名算法。我目前正在寻找一种良好且安全的散列函数,它要么是 Python 中的标准函数,要么可以轻松下载和导入。我想到了 SHA256,因为这是我所知道的唯一一个尚未被破坏的(据我所知)。但是,我也读过 SHA 不应该用于加密。 SHA256 是否适合数字签名算法?还是应该使用不同的散列函数?如果是这样,哪一个会是一个不错的选择?

【问题讨论】:

如果我需要在项目中进行消息签名,我会使用pythonhosted.org/itsdangerous,他们显然使用 HMAC 和 SHA1 SHA1 不是已经过时了吗?我认为它被证明是非常脆弱的?无论如何,我希望自己尽可能多地编程。这意味着我想为 ECDSA 编写几乎所有东西,除了散列函数,因为我对那个主题还不够了解。 @Anentropic 这是一个 MAC,不是签名。 MAC 是对称的。 @Dasherman HMAC-SHA-1 作为 MAC 仍然是安全的。在数字签名算法中使用 SHA-1 很弱。使用 SHA-2(SHA-256、SHA-512 等)进行签名。 【参考方案1】:

我将 SHA-512 用于类似目的,我认为您很难获得比这更安全的信息。 SHA-512 在 python 的 hashlib 中可用,可以这样使用:

import hashlib
hashGen = hashlib.sha512()
hashGen.update("What you want to hash")
hash = hashGen.hexdigest()
print "your hash is: ", hash

【讨论】:

1) 是否有可能从所有更新中“清除”对象,使其重新开始? 2) 如果我的椭圆曲线只使用 256 位素数和阶数,SHA512 是否值得使用? 1) 并非如此,但您可以通过重复 hashGen = hashlib.sha512() 行来实现相同的效果。 2)它应该仍然值得使用,但你不会拥有它的全部潜力(我不是 100% 的)。【参考方案2】:

目前可用的最佳标准化算法仍然是 SHA-2。 SHA-2 现在由 6 个哈希函数组成:首先定义了 SHA-256、SHA-384 和 SHA-512。后来添加了 SHA-224 以允许更小的输出大小。之后,引入了可用性较差的 SHA-512/224 和 SHA-512/256。

SHA-2 主要包括面向 32 位的 SHA-256 变体 - SHA-256 和 SHA-224 - 以及 64 位 SHA-512 变体 - 其他。 SHA-512 变体的性能实际上可能在 64 位机器上更高,因此引入了 SHA-512/224 和 SHA-512/256。基本上,SHA-256 / SHA-512 的变体仅在它们内部使用的常量和用作输出大小的位数上有所不同。一些较新的 Intel 和 AMD 处理器的 SHA 扩展只加速 SHA-256,而不是 SHA-512,可能在速度方面再次偏向 SHA-256。

在 SHA-3 比赛中发现 SHA-2 仍然非常强大,即使 SHA-1 受到攻击。如果 SHA-2 受到攻击,或者更好的哈希算法得到标准化并被使用,我建议只查看其他哈希。

来自***:

2005 年,SHA-1 中发现了安全漏洞,即可能存在数学弱点,这表明需要更强的哈希函数。[6]虽然 SHA-2 与 SHA-1 算法有一些相似之处,但这些攻击还没有成功地扩展到 SHA-2。

请注意,与 SHA-1 相比,SHA-2 使用了复杂得多的舍入函数。因此,尽管它具有相似的结构(两者都是所谓的 Merkle-Damgard 哈希),但 SHA-2 可能比 SHA-1 更能抵抗攻击。

【讨论】:

1) 对数字签名的消息进行散列一次就足够了吗?或者我应该在签名之前多次散列? 2) SHA-2 是否足以导出对称加密密钥,例如从用户输入或椭圆曲线点或 x 坐标?还是我应该为此使用不同的算法? 1) 一次。 2) 您应该使用 PBKDF,例如 PBKDF2 或 bcrypt/scrypt 作为密码,正式您应该使用 KBKDF,例如 HKDF。对于第二个,您可以作弊并使用(最左边的位)SHA-2 算法之一的输出作为 KDF。请注意,PBKDF2 建立在 HMAC 之上,而 HMAC 又建立在 SHA-2 等哈希函数之上。 你的“作弊”会比使用 HKDF 更容易受到攻击吗? 不太可能,但要证明它不是,它可能会使用底层哈希的一些“无意”属性。更多信息,例如here - KDF1/2 只是将一个计数器添加到要以最简单的形式散列的值。如果您直接使用 x 的值,您甚至可能会相当安全,但我至少会散列。 直接用字节形式的x坐标作为key怎么样?我应该同时散列 x 和 y 吗?还是只是 x,还是只是 y? (用于密钥派生)

以上是关于Python中的加密哈希函数的主要内容,如果未能解决你的问题,请参考以下文章

Python3-hashlib模块-加密算法之安全哈希

Python哈希函数hashlib

证明与计算: 从加密哈希函数到一致性哈希

哈希(hash) - 哈希算法的应用

我应该选择哪种加密哈希函数?

python之哈希算法