Encryption 使用SHA-1哈希作为AES密钥

Encryption 使用SHA-1哈希作为AES密钥,encryption,hash,language-agnostic,cryptography,Encryption,Hash,Language Agnostic,Cryptography,假设我想要“密码派生字节”作为AES密钥。 例如,我有一个密码“topsecret”,我为它计算SHA-1散列(160位),我想把这些字节作为AES-128的密钥 我应该在128位之后截断还是做一些折叠? AES-256怎么样?我应该重复字节,用0填充还是执行一些“展开”操作 我知道在后一种情况下,安全性仍然保持在160位,因为256位密码池减少到2^160个可能的组合,但我只是试图克服技术限制(没有AES-160) 理论怎么说? (不,使用MD5进行128位的哈希运算,使用SHA-256进行2

假设我想要“密码派生字节”作为AES密钥。 例如,我有一个密码“topsecret”,我为它计算SHA-1散列(160位),我想把这些字节作为AES-128的密钥

我应该在128位之后截断还是做一些折叠? AES-256怎么样?我应该重复字节,用0填充还是执行一些“展开”操作

我知道在后一种情况下,安全性仍然保持在160位,因为256位密码池减少到2^160个可能的组合,但我只是试图克服技术限制(没有AES-160)

理论怎么说?
(不,使用MD5进行128位的哈希运算,使用SHA-256进行256位的哈希运算是不可取的)

一个典型的密码只有几十位的熵,通过哈希函数运行密码不会增加任何熵。因此,使用字典或暴力很容易攻击这些密钥


最普遍接受的解决方案是使哈希函数非常慢。为此设计的算法称为“基于密码的密钥派生函数”。PBKDF2和bcrypt是最受欢迎的两种类型。

理论认为这并不重要。你可以用0来填充,也可以通过重复来填充,等等。结果中的熵量是相同的——同样难以使用暴力

至于将其截断为128位,不管您如何截断它-哈希输出的所有字节通常被认为是同等随机和不相关的。没有“更熵”的一面或其他东西


所以,从技术上讲,你可以随心所欲——你可以像密码一样强大。

这里要明确一点(呼应ntoskml)你的安全性永远不会是160位。对糟糕的密码进行哈希运算并不能给您带来更多的安全性-攻击者还可以对字典中的每个单词进行哈希运算。@andrewcooke:你说得对,我知道这一点。我本可以更精确一些。我的意思是SHA-1将安全性限制为160位。无论我使用SHA-1的密码有多强,它的安全性都将限制在最大160位。pbkdf将为您提供所需的字节数。出于纯粹的“教育目的”,如果您的密码超过160位,您可以通过执行
sha1(密码)+sha1(字节(0)+password)
并从中提取256位来生成保留该密码的密钥。在第二种情况下,您可以向密码添加任何内容。虽然我必须承认我没有这方面的参考资料,但你可以从改变密码中的任何一位都有50%的几率独立改变256位中的任何一位这一事实中看出这一点。(当然,假设散列是合理的)请注意,秘密密钥需要大量的熵。例如,56位DES密钥几乎一文不值,因为使用当前硬件,它们可以在20小时内强制执行。使用密码,情况是病态的——通过SHA-1运行一个1000万字的字典,在家用电脑上尝试每个键只需几秒钟。这就是为什么基于密码的加密采用不同的方法,使得密钥派生过程变得昂贵。因为答案完全正确,另一个确实提供了关于PBKDF2的提示,我必须选择一个。所以我接受ntoskml的。