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;
}