Encryption 如何查询需要加密的字段?

Encryption 如何查询需要加密的字段?,encryption,Encryption,我正在设计一个API,它使用应用程序级加密来保护数据库中的敏感信息 问题的一个简单示例是具有以下字段的用户表: 用户ID 名称 住址 电话号码 客户识别器 在上表中,所有字段都是敏感字段,除了UserID(它只是表的主键)之外,还应进行加密。当外键约束存在主键时,记录的实际标识值为ClientIdentifier。这是由API使用者控制的用户ID 当API的使用者希望创建用户记录时,他们会将所有详细信息(包括客户端标识)传递给我们,我们将其存储。当他们想要检索这些详细信息时,他们会再次向我们传递

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

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

用户ID 名称 住址 电话号码 客户识别器 在上表中,所有字段都是敏感字段,除了UserID(它只是表的主键)之外,还应进行加密。当外键约束存在主键时,记录的实际标识值为ClientIdentifier。这是由API使用者控制的用户ID

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

客户身份很可能是公众所知的,例如电子邮件地址或账号,并且可以追溯到真实的人。因此,我们必须确保ClientIdentifier的安全,因为记录的存在意味着该人存在于我们的系统中

我有几个选择

散列客户端标识。这样做的缺点是ClientIdentifier可能遵循固定格式,并且容易受到暴力攻击

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

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

所以我的问题是,你认为我走的是对的还是有更好的选择


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

如果设置了对用户id和密码进行加密,您可能需要查看一下。这是一种自适应哈希算法,您可以随时提高加密复杂性。您必须使用系统范围的salt,这仍然会使它容易受到字典攻击。最好的办法是随机生成一个帐户,其中包含用于客户端id的数字和字母,这将消除任何字典攻击。一定要使它足够长,以使它是


一般来说,用户id不加密,因为无法对用户id进行哈希,这使其容易受到攻击。在您跳过激烈的争论之前,我会确保您需要加密客户端id和密码。

在需要将clientId存储在加密的数据库中时,重新表述您的问题是否公平。客户端使用其ID发出请求,您需要使用客户端未加密地传递给您的clientID从数据库检索其行,而无需检索和解密每个请求上的每一行?是的,我认为这是一个公平的总结,因此,您必须能够加密/解密每个字段。大概clientId和地址/电话号码一样敏感。所以我认为你应该用你的算法对你得到的值进行加密,然后根据加密后的值进行搜索。请参阅下一条评论……不过,您可能需要一种验证客户机ID的方法。他们可能是通过SSL传递的,或者如果认为安全的话,当然应该是这样。在这种情况下,你真的把它当作密码。如果是这样的话,你应该分别对待客户ID和密码,客户ID通常是加密的,假设这是一封电子邮件,而密码只是作为密码的哈希结果存储的,因此没有办法逆转这一点。同意客户标识人的敏感度不低于任何其他数据。认证和授权已在本阶段完成。ClientIdentifier是一个用户的id,因此一个特定的消费者可能在系统中有许多用户,每个用户都有一个不同的ClientIdentifier。我认为我最初的示例有点失败,但继续您的用户id和密码类比。假设用户ID确实需要加密,并且格式是在我们无法控制和公开的情况下固定的。我们还需要基于该列运行查询。你认为不加盐的散列还是不加静脉注射的加密更好?或者使用完全不同的解决方案?