对弱加密进行测试
ID |
---|
WSTG-CRYP-04 |
总结
加密算法使用不当可能会导致敏感数据泄露、密钥泄露、身份验证中断、会话不安全和欺骗攻击。有一些已知较弱且不建议使用的加密或哈希算法,例如 MD5 和 RC4。
除了安全加密或哈希算法的正确选择外,参数的正确使用也与安全级别有关。例如,不建议在非对称加密中使用 ECB(电子代码簿)模式。
测试目标
- 为识别弱加密或哈希的使用和实施提供指南。
如何测试
基本安全检查表
- 使用 AES128 或 AES256 时,IV(初始化向量)必须是随机且不可预测的。请参阅FIPS 140-2 加密模块的安全要求,第 4.9.1 节。随机数生成器测试。例如,在 Java 中,
java.util.Random
被认为是弱随机数生成器。java.security.SecureRandom
应该使用 ,而不是java.util.Random
。 - 对于非对称加密,使用椭圆曲线加密(ECC),最好使用像
Curve25519
这样的安全曲线。- 如果无法使用 ECC,则使用至少具有 2048 位密钥的 RSA 加密。
- 在签名中使用 RSA 时,建议使用 PSS 填充。
- 不应使用弱哈希/加密算法,例如 MD5、RC4、DES、Blowfish、SHA1。1024 位 RSA 或 DSA、160 位 ECDSA(椭圆曲线)、80/112 位 2TDEA(两个密钥三重 DES)
- 最小密钥长度要求:
Key exchange: Diffie–Hellman key exchange with minimum 2048 bits
Message Integrity: HMAC-SHA2
Message Hash: SHA2 256 bits
Asymmetric encryption: RSA 2048 bits
Symmetric-key algorithm: AES 128 bits
Password Hashing: PBKDF2, Scrypt, Bcrypt
ECDH, ECDSA: 256 bits
- 不应使用 SSH、CBC 模式。
- 使用对称加密算法时,不应使用 ECB (Electronic Code Book) 模式。
- 使用 PBKDF2 对密码进行哈希运算时,建议 iteration 的参数大于 10000。 NIST还建议至少对哈希函数进行 10,000 次迭代。此外,禁止将 MD5 哈希函数与 PBKDF2 一起使用,例如 PBKDF2WithHmacMD5。
源代码审查
-
搜索以下关键字以识别弱算法的使用情况:
MD4, MD5, RC4, RC2, DES, Blowfish, SHA-1, ECB
-
对于 Java 实现,以下 API 与加密相关。查看加密实现的参数。例如
SecretKeyFactory(SecretKeyFactorySpi keyFacSpi, Provider provider, String algorithm)
SecretKeySpec(byte[] key, int offset, int len, String algorithm)
Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
- 对于 RSA 加密,建议使用以下填充模式。
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (2048)
- 搜索
ECB
,它不允许被用于填充。 - 检查是否使用不同的 IV(初始向量)。
// Use a different IV value for every encryption
byte[] newIv = ...;
s = new GCMParameterSpec(s.getTLen(), newIv);
cipher.init(..., s);
...
- 搜索
IvParameterSpec
,检查 IV 值是否以不同方式随机生成。
IvParameterSpec iv = new IvParameterSpec(randBytes);
SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skey, iv);
-
在 Java 中,搜索 MessageDigest 以检查是否使用了弱哈希算法(MD5 或 CRC)。例如:
MessageDigest md5 = MessageDigest.getInstance("MD5");
-
对于签名,不应使用 SHA1 和 MD5。例如:
Signature sig = Signature.getInstance("SHA1withRSA");
-
搜索
PBKDF2
。要生成 password 的哈希值,建议使用PBKDF2
。查看参数以生成PBKDF2
has 值。
迭代次数应超过 10000,并且 salt 值应生成为 **随机值 **。
private static byte[] pbkdf2(char[] password, byte[] salt, int iterations, int bytes)
throws NoSuchAlgorithmException, InvalidKeySpecException
{
PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, bytes * 8);
SecretKeyFactory skf = SecretKeyFactory.getInstance(PBKDF2_ALGORITHM);
return skf.generateSecret(spec).getEncoded();
}
- 硬编码敏感信息:
User related keywords: name, root, su, sudo, admin, superuser, login, username, uid
Key related keywords: public key, AK, SK, secret key, private key, passwd, password, pwd, share key, shared key, cryto, base64
Other common sensitive keywords: sysadmin, root, privilege, pass, key, code, master, admin, uname, session, token, Oauth, privatekey, shared secret
工具
- Nessus、NMAP(脚本)或 OpenVAS 等漏洞扫描程序可以扫描针对 SNMP、TLS、SSH、SMTP 等协议的弱加密的使用或接受情况。
- 对于以下情况,使用静态代码分析工具进行源代码审查,例如 klocwork、Fortify、Coverity、CheckMark。
CWE-261: Weak Cryptography for Passwords
CWE-323: Reusing a Nonce, Key Pair in Encryption
CWE-326: Inadequate Encryption Strength
CWE-327: Use of a Broken or Risky Cryptographic Algorithm
CWE-328: Reversible One-Way Hash
CWE-329: Not Using a Random IV with CBC Mode
CWE-330: Use of Insufficiently Random Values
CWE-347: Improper Verification of Cryptographic Signature
CWE-354: Improper Validation of Integrity Check Value
CWE-547: Use of Hard-coded, Security-relevant Constants
CWE-780: Use of RSA Algorithm without OAEP
引用
- NIST FIPS 标准
- 维基百科: 初始化向量
- Secure Coding - Generating Strong Random Numbers
- 安全编码 - 生成强随机数
- 最佳非对称加密填充
- 加密存储作弊表
- 安全编码 - 不要使用不安全或弱加密算法
- 不安全的随机性
- 熵不足
- 会话 ID 长度不足
- 使用损坏或有风险的加密算法
- Javax.crypto.cipher API
- ISO 18033-1:2015 – 加密算法
- ISO 18033-2:2015 – 非对称密码
- ISO 18033-3:2015 – 分组密码