Encryption 是否可以使用SHA-256使用PBKDF2导出128位AES密钥

Encryption 是否可以使用SHA-256使用PBKDF2导出128位AES密钥,encryption,aes,password-encryption,pbkdf2,webcrypto-api,Encryption,Aes,Password Encryption,Pbkdf2,Webcrypto Api,我正在开发一个加密协议,我必须在CTR模式下创建AES密钥。我决定将密钥长度保持在128位,因为越短的密钥大小意味着移动设备的计算能力越低 现在,为了创建这个密钥,我使用PBKDF2,它允许我设置它的某些参数,比如散列函数和迭代数,因为它使用初始信息(比如密码)来派生密钥,这就是我所拥有的。由于SHA-1已损坏,我想使用SHA-256进行密钥派生函数的密钥散列,但我不知道这是否可行。由于我希望密钥为128位,而SHA-256产生256位,PBKDF2能做到这一点吗?首先,AES-256与AES-

我正在开发一个加密协议,我必须在CTR模式下创建AES密钥。我决定将密钥长度保持在128位,因为越短的密钥大小意味着移动设备的计算能力越低


现在,为了创建这个密钥,我使用PBKDF2,它允许我设置它的某些参数,比如散列函数和迭代数,因为它使用初始信息(比如密码)来派生密钥,这就是我所拥有的。由于SHA-1已损坏,我想使用SHA-256进行密钥派生函数的密钥散列,但我不知道这是否可行。由于我希望密钥为128位,而SHA-256产生256位,PBKDF2能做到这一点吗?

首先,AES-256与AES-128相比并不慢。看

CPU开销(192位密钥为+20%,256位密钥为+40%):

PBKDF2的输出大小等于使用的PRF函数,在您的情况下,它是一个哈希函数,如SHA-256。因此,输出大小为256位

PBKDF2的功能需要
dkLen
参数-所需的键长

PBKDF2(PRF、密码、Salt、c、dkLen)

当您将128放入此参数时,您将获得128位。输出是完整256位输出的子字符串。您将获得前128位


您可以从实现中看到,AES-256比AES-128慢不了多少,按键设置稍微慢一点,每个块只需要再多4轮(11到15轮)。因此,最多慢40%左右,而配备专用AES指令集的现代手机可能更少

PBKDF2可以输出几乎任何大小的密钥,并且大多数HMAC-SHA1或HMAC-SHA256(不是SHA1或SHA256直接输出,但大多数API只接受散列函数作为参数并隐式执行HMAC)被用作构建块“随机函数”。但任何一个都可以生成256、128或10000字节的密钥(无论如何,您不需要那么大的密钥)。对于HMAC-SHA256,派生256或128位密钥(后者是前者的截断版本,但这不是问题)同样便宜或昂贵;这是相同的工作。对于HMAC-SHA1(对于PBKDF2,它与HMAC-SHA256一样安全),获得256位密钥的工作要稍微多一些,因为256大于摘要大小


因此,使用AES-256和PBKDF2-(HMAC)-SHA256,应该没有性能问题。

非常感谢您的回答,因此如果这256位被修剪,前128位被采用,这是否意味着密钥不太安全?简短的回答是否。哈希函数的设计实现了这一点。您可以看到,SHA-224具有不同的初始参数,但结果被截断为224-b信息技术