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的主要内容,如果未能解决你的问题,请参考以下文章

PBKDF2-HMAC-SHA256 for JAVA 的可靠实现

PBKDF2-HMAC-SHA1

将 PBKDF2 与 OpenSSL 库一起使用