我正在设计一个 API,它使用应用程序级加密来保护数据库中的敏感信息。
该问题的一个简单示例是具有以下字段的用户表:
- 用户身份
- 姓名
- 地址
- 电话号码
- 客户标识符
在上表中,所有字段都是敏感的,除了 UserID 是表的主键之外,都应该被加密。虽然存在外键约束的主键,但记录的实际标识值是 ClientIdentifier。这是由 API 的使用者控制的用户 ID。
当 API 的使用者希望创建用户记录时,他们会将所有详细信息(包括 ClientIdentifier)传递给我们存储的信息。当他们想要检索这些详细信息时,他们再次将 ClientIdentifier 传递给我们。对于这个用例,他们不能使用 UserID。
ClientIdentifier 很可能是公共知识,例如电子邮件地址或帐号,并且可以追溯到真实的人。因此,我们必须保护 ClientIdentifier,因为记录的存在意味着该人存在于我们的系统中。
我看到了几个选项。
散列 ClientIdentifier。这样做的缺点是 ClientIdentifier 可能遵循固定格式并且容易受到暴力攻击。
加密所有数据,但在 ClientIdentifier 的情况下使用固定的 IV。这里的缺点是可以访问 API 和数据库的攻击者可以对系统执行纯文本攻击。
我倾向于第二种选择,因为纯文本攻击可能会通过监视加密服务来缓解,而如果数据库的快照丢失,散列选项可能会很快被破坏。
所以我的问题是,你认为我走在正确的轨道上还是有更好的选择?
编辑:我们可能在数据库中有多个具有相同 ClientIdentifier 的记录。给定一个明文 ID,我们应该能够选择所有这些记录。