RFC 3414(SNMPv3 用户安全模型)密码到密钥方法有什么优点吗?

信息安全 哈希 密码
2021-08-11 00:14:44

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都是相同的(并且您不需要尝试所有变体)。aaaaaaaaaaa....aaaaaa


我对密码安全和散列的了解都告诉我,这不仅是一个愚蠢的设计,而且实际上破坏了散列算法并降低了安全性。这种密钥生成方法实际上有好处吗?这到底是如何进入明确关注安全性的 RFC 的?

1个回答

我对密码安全和散列的了解都告诉我,这不仅是一个愚蠢的设计,而且实际上破坏了散列算法并降低了安全性。

关于数字身份指南的特别出版物 800-63B 建议密码不必长而复杂,而是对密码有以下说明:

  • 最少 8 个字符,最多 64 个字符

  • 能够使用所有特殊字符,但对使用它们没有特殊要求

  • 限制连续和重复的字符(例如 12345 或 aaaaaa)

  • 限制特定于上下文的密码(例如站点名称等)

  • 限制常用密码(如p@ssw0rd等)和字典词

  • 限制从以前的违规语料库中获得的密码

我会说 rfc3414 不会禁止这些准则,并且实现可以为密码生成提供额外的准则。第 11.2 节似乎在恳求实施者鼓励使用好的密码。还应该注意的是,11.2 中的措辞似乎表明该算法是一个示例,而不是要求。

这种密钥生成方法实际上有好处吗?

在第 2.6 节中描述了一种关键的本地化技术 附录中的示例具有 engineID 的附加(第三个)参数,该参数特定于权威 SNMP 引擎。

void password_to_key_md5(
      u_char *password,    /* IN */
      u_int   passwordlen, /* IN */
      u_char *engineID,    /* IN  - pointer to snmpEngineID  */
      u_int   engineLength,/* IN  - length of snmpEngineID */
      u_char *key)         /* OUT - pointer to caller 16-octet buffer */

所以基本上密码是加盐的。

这到底是如何进入明确关注安全性的 RFC 的?

请记住,这是在 Windows 中的密码散列之后不久编写的:

MD4(UTF-16-LE(password))