4.9.4-对弱加密进行测试

对弱加密进行测试

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

引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值