MASWE-0014:未正确存储受保护的加密密钥
概述¶
加密密钥对于保护移动应用中的敏感数据至关重要。然而,如果这些密钥在静态存储时未得到妥善保护,它们就很容易被泄露。这种弱点包括将加密密钥存储在不安全的位置,例如未加密的 SharedPreferences、未受保护的文件中,在应用程序代码中硬编码它们,或者将它们包含在可能最终出现在生产环境中的最终应用程序包的源代码控制和版本控制系统中。
攻击者可以反编译或逆向工程应用程序,以提取硬编码的密钥。
影响¶
- 未经授权的访问:如果加密密钥未得到妥善保护,攻击者可能会未经授权地访问敏感数据并窃取身份信息。
- 完整性丢失:被泄露的密钥可能允许攻击者篡改加密数据。
- 机密性丢失:敏感信息可能被泄露,导致机密性丢失。一旦密钥暴露,所有使用这些密钥加密的数据都将面临风险。
引入方式¶
- 不安全的存储位置:将加密密钥存储在未加密的 SharedPreferences、未受保护的文件或其他不安全的位置。
- 硬编码密钥:将加密密钥直接包含在应用程序代码中,使其容易通过反编译和逆向工程被提取。
- 缺乏加密:以明文形式导出加密密钥,而没有使用安全方法对其进行加密。
缓解措施¶
- 使用平台密钥库:在可能的情况下,在设备上动态生成加密密钥,而不是使用预定义密钥,并确保在创建后安全存储。为此,您可以使用特定于平台的密钥库,例如 Android KeyStore 或 iOS KeyChain。
- 实施最强的硬件安全解决方案:对于最关键的情况,以及在现有用例中 可用且兼容 时,应利用最强大的硬件支持安全选项,例如 Android StrongBox 或 iOS 的安全区 (Secure Enclave)
kSecAttrTokenIDSecureEnclave
选项,以确保最高级别的保护,包括物理攻击和侧信道攻击。 - 使用加密密钥管理系统:从提供敏感数据安全存储、访问控制和审计功能的服务器端服务安全地检索密钥。例如,AWS Secrets Manager、Azure Key Vault 或 Google Cloud Secret Manager 是一些流行的托管密钥存储解决方案。应用程序可以通过安全的、经过身份验证的 API 调用在运行时安全地检索必要的密钥。
- 加密并包装密钥:当平台密钥库不适合存储密钥,或者需要导出密钥时,请使用信封加密(DEK+KEK)和密钥包装技术,如 NIST.SP.800-175Br1 5.3.5 中所述,以在存储加密密钥之前保护它们。
- 遵循标准密钥管理最佳实践:实施适当的密钥管理实践,包括密钥轮换和针对存储中密钥的强大保护机制,如 NIST.SP.800-57pt1r5 6.2.2 中所述,确保密钥的可用性、完整性、机密性,以及与用途、实体和相关信息的正确关联。
测试¶
MASTG-TEST-0212:代码中硬编码加密密钥的使用 MASTG-TEST-0214:文件中硬编码加密密钥 MASTG-TEST-0213:代码中硬编码加密密钥的使用