跳过内容

C2:使用加密技术保护数据

描述

敏感数据,如密码、信用卡号、健康记录、个人信息和商业秘密,需要额外的保护,特别是当这些数据受隐私法(欧盟通用数据保护条例 GDPR)、金融数据保护规则(如 PCI 数据安全标准 (PCI DSS))或其他法规管辖时。

攻击者可以通过多种方式从网络和 Web 服务应用程序窃取数据。例如,如果敏感信息在没有通信安全的情况下通过互联网发送,那么共享无线连接上的攻击者可以捕获并窃取另一个用户的数据。此外,攻击者还可以利用 SQL 注入从应用程序数据库中窃取密码和其他凭据,并将这些信息公开。

隐私是确保关于某个实体的特定信息的机密性和访问性受到保护。开发人员所构建的东西的用户希望其信息受到保护,免遭泄露。

保护敏感数据,如密码、信用卡号、健康记录、个人信息和商业秘密。

存在法规来强制公司保护用户的个人信息。欧盟重视个人隐私,因此他们制定了欧盟通用数据保护条例 GDPR。金融数据保护规则,如 PCI 数据安全标准 (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 数据安全标准 (PCI DSS))或其他法规管辖时。攻击者可以通过多种方式从网络和 Web 服务应用程序窃取数据。例如,如果敏感信息在没有通信安全的情况下通过互联网发送,那么共享无线连接上的攻击者可以捕获并窃取另一个用户的数据。此外,攻击者还可以利用 SQL 注入从应用程序数据库中窃取密码和其他凭据,并将这些信息公开。

使用当前密码协议

开发 Web 应用程序时,通常会使用 传输层安全协议 (TLS) 进行传输加密。请使用 TLSv1.2 或 TLSv1.3,首选 TLSv1.3。如果可能,请研究 HTTP/2 或 HTTP/3 的使用,因为它们保证使用安全 TLS 版本/算法。

  • 直接关闭其他旧协议以避免协议降级攻击。
  • 不要提供 HTTP 服务。同时禁用 HTTP 和 SSL 压缩。
  • 始终使用安全的随机数生成器 (RNG)。

指示客户端强制执行传输层加密

Web 服务器可以指示 Web 浏览器保持最低限度的传输层安全

  • 使用 Strict-Transport-Security 标头强制执行机会性加密和证书验证检查。
  • Content-Security-Policy 允许客户端自动从 HTTP 升级到 HTTPS。
  • 设置 cookie 时,始终使用“secure”标志以防止通过 HTTP 传输。

支持密码敏捷性:密码学随时间变化

密码学建议会随时间变化。为此,请将密码学选择(例如所使用的算法或密钥大小)设置为可配置。这被称为 密码敏捷性

如果应用程序需要支持高可用性,请设计密钥滚动更新过程。

防止的漏洞

参考资料

工具