PBKDF2-HMAC-SHA1
Posted
技术标签:
【中文标题】PBKDF2-HMAC-SHA1【英文标题】: 【发布时间】:2011-01-28 18:30:27 【问题描述】:要为 WPA2 网络生成有效的成对主密钥,路由器使用 算法。我知道 sha1 函数执行了 4096 次来导出 PMK,但是我对这个过程有两个问题。
请原谅伪代码。
1) SHA1 函数的第一个实例的输入是如何格式化的? SHA1("network_name"+"network_name_length"+"network_password")
它是按那个顺序格式化的,是网络名称、长度和密码的十六进制值还是直接的 ASCII?
然后根据我收集到的 160 位摘要,直接将其送入另一轮散列,而无需任何额外的加盐。像这样:SHA1("160bit digest from last round of hashing") 上升并重复。
2) 一旦发生这种情况,输出的 4096 乘以 256 位将用作成对主密钥。我不明白的是,如果 SHA1 产生 160 位输出,那么算法如何达到密钥所需的 256 位?
感谢您的帮助。
【问题讨论】:
【参考方案1】:是的,为 WPA 网络生成二进制密钥的算法是:
key = PBKDF2(密码、ssid、4096、256)
PBKDF2 描述于http://www.ietf.org/rfc/rfc2898.txt
它使用 HMAC 算法来创建输入的摘要。 HMAC 可以使用任何散列函数,这里的规范要求 SHA1,正如你所提到的。哈希是在 HMAC 算法中的中间状态上完成的:
H(K XOR opad, H(K XOR ipad, text))
(H=选择的哈希函数,K 是密码,文本是 ssid)
这个 HMAC 过程被 PBKDF2 重复了 4096 次。
HMAC 算法:http://www.ietf.org/rfc/rfc2104
这里有一个派生密钥的源示例:
https://www.codeblog.org/viewsrc/openssl-engine-0.9.6a/crypto/evp/p5_crpt2.c
int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen,
80: unsigned char *salt, int saltlen, int iter,
81: int keylen, unsigned char *out)
salt 是 SSID,pass 是密码。
【讨论】:
以上是关于PBKDF2-HMAC-SHA1的主要内容,如果未能解决你的问题,请参考以下文章