SV.WEAK_CRYPTO.WEAK_HASH

弱密码漏洞

暴力密码破解是对密码安全性最严重的威胁之一。如果软件的加密方案相对于需要的保护级别而言不够强大,则使用最新攻击方法和资源的暴力攻击可能成功。SV.WEAK_CRYPTO.WEAK_HASH 检查器会标记使用 DES 加密的 encrypt、crypt* 和 setkey 加密序列,该加密方式不能针对暴力密码攻击提供足够的保护。

漏洞与风险

如果未对敏感数据进行足够的保护,可能导致保密性或数据完整性的损失。DES 加密可能被暴力攻击所破解。基于 MD5 的算法更安全一些,因此它比 DES 算法更优先,但即便是更新的 SHA-1 算法也已经被破解。哈希算法(例如 SHA-256 和 SHA-512)经过美国联邦信息处理标准 (FIPS) 的审核,被认为在安全性方面更为出色。请务必使用相关领域专家所推荐的最新加密算法。

缓解与预防

要避免弱加密的问题:

  • 请尽可能使用来自经证实的安全加密实验室的最强大加密算法。
  • 如果您的代码访问现有的需要权限的服务,则让该服务来进行身份验证。
  • 请勿对敏感数据进行硬编码或保存加密密钥。
  • 如果您使用 MD5 加密,请确保包含一个 salt 参数(以“$1$”开头的字符串)来对加密算法进行改变。

漏洞代码示例

复制
   #include <stdio.h>
   #include <time.h>
   #include <unistd.h>
   #include <crypt.h>
    
   int
   main(void)
   {
     unsigned long seed[2];
    char salt[] = "$1$........";
    const char *const seedchars =
      "./0123456789ABCDEFGHIJKLMNOPQRST"
      "UVWXYZabcdefghijklmnopqrstuvwxyz";
    char *password;
    int i;
   
    /* Generate a (not very) random seed.
       您可以做得比这更好...*/
    seed[0] = time(NULL);
    seed[1] = getpid() ^ (seed[0] >> 14 & 0x30000);
   
    /* Turn it into printable characters from 'seedchars'.*/
    for (i = 0; i < 8; i++)
      salt[3+i] = seedchars[(seed[i/5] >> (i%5)*6) & 0x3f];
  
    /* Read in the user's password and encrypt it.*/
    password = crypt(getpass("Password:"), salt); // SV.WEAK_CRYPTO.WEAK_HASH is reported here
  
    /* Print the results.*/
    puts(password);
    return 0;
  }