RFC 3414(2002 年发布)在其附录中指定了一种基于密码生成密钥的方法,该方法基本上采用任何“密码短语”,并不断重复,直到出现 1MB 字符串,此时它采用 SHA1 或 MD5该数据用作键:
/**********************************************/
/* Use while loop until we've done 1 Megabyte */
/**********************************************/
while (count < 1048576) {
cp = password_buf;
for (i = 0; i < 64; i++) {
/*************************************************/
/* Take the next octet of the password, wrapping */
/* to the beginning of the password as necessary.*/
/*************************************************/
*cp++ = password[password_index++ % passwordlen];
}
SHAUpdate (&SH, password_buf, 64);
count += 64;
}
SHAFinal (key, &SH); /* tell SHA we're done */
它还规定了最小长度安全要求:
SNMP 实施(和 SNMP 配置应用程序)必须确保密码长度至少为 8 个字符。
然后进行观察:
请注意,带有重复字符串的较长密码可能会产生完全相同的密钥。例如,密码“bertbert”将产生与密码“bertbertbert”完全相同的密钥。
重复输入似乎是最少 8 个字符的众所周知的“解决方法”:如果要使用密码a
,只需输入aaaaaaaa
. 事实上,无论哪种情况,它实际上都会被转换为a
重复 1048576 次(1MB),然后进行哈希处理。如果您尝试暴力破解密码,密码,a
和都是相同的(并且您不需要尝试所有变体)。aa
aaa
aaaaaa....aaaaaa
我对密码安全和散列的了解都告诉我,这不仅是一个愚蠢的设计,而且实际上破坏了散列算法并降低了安全性。这种密钥生成方法实际上有好处吗?这到底是如何进入明确关注安全性的 RFC 的?