1

我正在设计一个 API,它使用应用程序级加密来保护数据库中的敏感信息。

该问题的一个简单示例是具有以下字段的用户表:

  • 用户身份
  • 姓名
  • 地址
  • 电话号码
  • 客户标识符

在上表中,所有字段都是敏感的,除了 UserID 是表的主键之外,都应该被加密。虽然存在外键约束的主键,但记录的实际标识值是 ClientIdentifier。这是由 API 的使用者控制的用户 ID。

当 API 的使用者希望创建用户记录时,他们会将所有详细信息(包括 ClientIdentifier)传递给我们存储的信息。当他们想要检索这些详细信息时,他们再次将 ClientIdentifier 传递给我们。对于这个用例,他们不能使用 UserID。

ClientIdentifier 很可能是公共知识,例如电子邮件地址或帐号,并且可以追溯到真实的人。因此,我们必须保护 ClientIdentifier,因为记录的存在意味着该人存在于我们的系统中。

我看到了几个选项。

  1. 散列 ClientIdentifier。这样做的缺点是 ClientIdentifier 可能遵循固定格式并且容易受到暴力攻击。

  2. 加密所有数据,但在 ClientIdentifier 的情况下使用固定的 IV。这里的缺点是可以访问 API 和数据库的攻击者可以对系统执行纯文本攻击。

我倾向于第二种选择,因为纯文本攻击可能会通过监视加密服务来缓解,而如果数据库的快照丢失,散列选项可能会很快被破坏。

所以我的问题是,你认为我走在正确的轨道上还是有更好的选择?

编辑:我们可能在数据库中有多个具有相同 ClientIdentifier 的记录。给定一个明文 ID,我们应该能够选择所有这些记录。

4

1 回答 1

0

如果您设置加密用户 id 和密码,您可能想看看bcrypt。它是一种自适应哈希算法,您可以随时提高加密复杂性。您必须使用系统范围的盐,这仍然会使它容易受到字典攻击。您最好的选择是随机生成一个帐户#(带有数字和字母)用于客户端 ID,这应该可以抵消任何字典攻击。一定要让它足够长以保证安全

通常,用户 id 没有加密,因为无法对用户 id 的哈希值进行加盐,这使得它容易受到攻击。在您跳过燃烧的箍之前,我会确保您需要加密客户端 ID 和密码。

于 2013-07-15T19:20:25.523 回答