C2:使用加密技术保护数据
描述
敏感数据,例如密码、信用卡号、健康记录、个人信息和商业秘密,需要额外保护,特别是当这些数据受隐私法(欧盟《通用数据保护条例》GDPR)、金融数据保护规则(如支付卡行业数据安全标准 PCI DSS)或其他法规管辖时。
攻击者可以通过多种方式从网络和Web服务应用程序中窃取数据。例如,如果敏感信息在没有通信安全的情况下通过互联网发送,那么在共享无线连接上的攻击者可以捕获并窃取另一个用户的数据。此外,攻击者还可以使用SQL注入从应用程序数据库中窃取密码和其他凭据,并将这些信息公开。
隐私是确保关于某个实体的特定信息的机密性和访问受到保护。开发人员所构建事物的用户希望他们的信息不被泄露。
保护敏感数据,例如密码、信用卡号、健康记录、个人信息和商业秘密。
存在法规以强制公司保护用户的个人信息。欧盟重视个人隐私,因此他们制定了欧盟《通用数据保护条例》GDPR。金融数据保护规则,如支付卡行业数据安全标准(PCI DSS),也旨在保护持卡人的隐私。
密码学是关于使明文信息变得不可理解并将加密信息恢复为可理解形式的原理、方法和手段的艺术或科学。个人用户数据需要密码学来确保在存储时得到妥善保护。
对应用程序中的数据类型进行分类
对系统中的数据进行分类,并确定每条数据所属的敏感度级别至关重要。然后,每个数据类别都可以映射到每个敏感度级别所需的保护规则。例如,不敏感的公共营销信息可能被归类为公共数据,可以放置在公共网站上。信用卡号可能被归类为私人用户数据,需要在存储、处理或传输过程中进行加密。
数据分类也可能由立法强制执行,例如在为欧盟用户提供服务时需要遵守GDPR。
对系统中发送、处理和存储的数据进行分类,并确定数据的敏感度级别。对数据进行分类以定义每种类型的特定保护规则。规则的创建使您的团队能够执行数据最小化,并尽可能避免存储敏感数据。
例如,不敏感的公共营销信息可能被归类为公共数据,可以放置在公共网站上,不需要加密。信用卡号则需要在存储、处理和传输过程中进行加密。
威胁
- 攻击者可能利用弱或过时的加密算法来解密敏感信息。
- 未妥善存储的加密密钥可能被泄露,导致未经授权的数据访问。
- 攻击者可以执行SQL注入攻击,从数据库中窃取加密数据。
- 未能实施适当的密钥管理可能导致未经授权地访问加密数据。
实施
关于密码学,有一些简单的规则
- 切勿传输明文数据。技术上已经能够轻松加密在任意A点和B点之间发送的所有数据。请务必使用密码学来保护所有静态数据和传输中的数据。
- 不要创建自己的加密协议。创建加密协议是一个棘手的问题。当NIST创建AES时,他们举行了一场公开竞赛,世界顶尖密码学家提交了提案,然后寻找其他提案中的缺陷。与其将开发精力用于创建新的加密协议,不如使用现有经过实战检验的标准。将您的创新集中在改进您的功能或产品上。
- 不要自己实现加密例程。请使用已实现加密例程的现有库。
保护静态数据
敏感数据管理的首要规则是尽可能避免存储敏感数据。如果必须存储敏感数据,则务必确保其通过某种方式进行加密保护,以避免未经授权的泄露和修改。
密码学(或加密)是信息安全领域中更为高级的主题之一,其理解需要最多的教育和经验。它很难正确掌握,因为加密有许多方法,每种方法都有其优缺点,需要Web解决方案架构师和开发人员彻底理解。此外,严肃的密码学研究通常基于高等数学和数论,这构成了严重的入门障碍。
设计或构建加密算法非常容易出错(参见旁道攻击)。强烈建议不要从头开始构建加密功能,而应使用经过同行评审的开源解决方案,例如 Google Tink 项目、Libsodium,以及许多软件框架和云服务中内置的安全存储功能。
安全存储密码
大多数Web应用程序都将面临存储用户密码以设置身份验证服务的挑战。安全地存储密码,以确保攻击者无法快速获取它们。切勿在数据库中的任何位置以明文形式存储密码。始终使用哈希函数来存储密码。通过为每个项添加随机盐值来增强哈希函数,以增加哈希值的随机性。
特殊情况:应用程序秘密管理
应用程序包含许多安全操作所需的“秘密”。这包括证书、SQL连接密码、第三方服务账户凭据、密码、SSH密钥、加密密钥等。未经授权泄露或修改这些秘密可能导致整个系统被攻陷。在管理应用程序秘密时,请考虑以下事项:不要将秘密存储在代码、配置文件中或通过环境变量传递。使用GitRob或TruffleHog等工具扫描代码仓库以查找秘密。您的代码应该以即使您的代码被泄露(例如,由于配置有缺陷的GitHub仓库),您运行中的应用程序仍然安全的方式编写。将密钥和您的其他应用程序级秘密保存在秘密保险库中,例如KeyWhiz或Hashicorp的Vault项目、Amazon KMS或AWS Secrets Manager,以在运行时提供应用程序级秘密的安全存储和访问。许多Web框架,例如Ruby on Rails,提供了处理秘密和凭据的集成方式。
密钥生命周期
应用程序中一些敏感功能会使用秘密密钥。例如,秘密密钥可用于签名JWT、保护信用卡、提供各种形式的身份验证以及促进其他敏感安全功能。在管理密钥时,应遵循以下规则,包括:
- 确保任何秘密密钥都受到保护,防止未经授权的访问
- 所有对秘密密钥的授权访问都应记录下来,以备取证之用。
- 将密钥存储在下方所述的适当秘密保险库中
- 当需要多个密钥时,使用独立的密钥
- 构建支持更改加密算法的功能,为未来所需的更改做准备
- 构建应用程序功能以优雅地支持和处理密钥轮换。这可以定期发生,也可以在密钥泄露后发生。
保护传输中的数据
敏感数据,例如密码、信用卡号、健康记录、个人信息和商业秘密,需要额外保护,特别是当这些数据受隐私法(欧盟《通用数据保护条例》GDPR)、金融数据保护规则(如支付卡行业数据安全标准 PCI DSS)或其他法规管辖时。攻击者可以通过多种方式从Web和Web服务应用程序中窃取数据。例如,如果敏感信息在没有通信安全的情况下通过互联网发送,那么在共享无线连接上的攻击者可以捕获并窃取另一个用户的数据。此外,攻击者还可以使用SQL注入从应用程序数据库中窃取密码和其他凭据,并将这些信息公开。
使用当前加密协议
在开发Web应用程序时,您通常会使用传输层安全协议(TLS)进行传输加密。请使用TLSv1.2或TLSv1.3,首选TLSv1.3。如果可能,请研究HTTP/2或HTTP/3的使用,因为它们保证使用安全的TLS版本/算法。
- 直接关闭其他旧协议,以避免协议降级攻击。
- 不要提供HTTP。同时禁用HTTP和SSL压缩。
- 始终使用安全的随机数生成器(RNG)。
指示客户端强制执行传输层加密
Web服务器可以指示Web浏览器维护最低传输层安全性
- 使用Strict-Transport-Security Header(严格传输安全头)来强制执行机会性加密和证书验证检查。
- Content-Security-Policy(内容安全策略)允许客户端自动将HTTP升级到HTTPS。
- 设置Cookie时,始终使用“secure”标志以防止通过HTTP传输。
支持加密灵活性:密码学随时间变化
密码学建议会随着时间而变化。为了适应这一点,应将加密选择(例如使用的算法或密钥大小)配置为可配置的。这被称为加密灵活性。
如果应用程序需要支持高可用性,请设计密钥轮转程序。
防止的漏洞
- https://owasp.org/Top10/A02_2021-Cryptographic_Failures/
- https://mas.owasp.ac.cn/MASVS/controls/MASVS-CRYPTO-1/
参考资料
- OWASP 速查表:传输层保护
- Ivan Ristic:SSL/TLS 部署最佳实践
- OWASP 速查表:HSTS
- OWASP 速查表:加密存储
- OWASP 速查表:密码存储
- OWASP Web安全测试指南:弱密码学测试
- OWASP WrongSecrets :包含如何*不*使用秘密的示例的脆弱应用程序
工具
- https://github.com/nabla-c0d3/sslyze
- https://testssl.sh/
- SSLyze - SSL 配置扫描库和命令行工具
- SSLLabs - 用于扫描和检查 TLS/SSL 配置的免费服务
- OWASP O-Saft TLS 工具 - TLS 连接测试工具
- GitRob - 用于在 GitHub 公开文件中查找敏感信息的命令行工具
- TruffleHog - 搜索意外提交的秘密
- Hashicorp Vault - 秘密管理器
- Amazon KMS - 在AWS上管理密钥
- AWS Secrets Manager - 在AWS上管理秘密
- Azure Key Vault - 在Azure上管理密钥和秘密
- Google Cloud KMS - 在Google Cloud Platform上管理密钥
- Google Secret Manager - 在Google Cloud Platform上管理秘密