我们有一个场景,我们需要防止两个用户使用相同的标识符。标识符是敏感的(例如社会安全号码),所以我们不想将它存储在我们的数据库中。我们只想存储某种哈希值,以防止后续用户再次使用它。我们希望安全地做到这一点,以便在数据库泄漏的情况下,攻击者无法找出原始值。
是否可以安全地进行?推荐的方法是什么?
根据一些研究,HMAC 似乎可以工作。如果是这样,推荐的算法是什么?它应该是缓慢的(比如使用固定密钥盐的 scrypt),因此如果密钥被暴露,仍然很难发现这些值?还是没有针对这种情况的保护措施?
我们有一个场景,我们需要防止两个用户使用相同的标识符。标识符是敏感的(例如社会安全号码),所以我们不想将它存储在我们的数据库中。我们只想存储某种哈希值,以防止后续用户再次使用它。我们希望安全地做到这一点,以便在数据库泄漏的情况下,攻击者无法找出原始值。
是否可以安全地进行?推荐的方法是什么?
根据一些研究,HMAC 似乎可以工作。如果是这样,推荐的算法是什么?它应该是缓慢的(比如使用固定密钥盐的 scrypt),因此如果密钥被暴露,仍然很难发现这些值?还是没有针对这种情况的保护措施?
我认为您离可能的解决方案不远了(也就是使用现代 KDF 并有效地将其视为密码)。但是,还有更多考虑因素(评论中已经提到):
1 和 2 的组合会使 KDF 成为一个坏主意,即使它是您唯一的选择。因此,可能需要找到不同的业务解决方案。但是,如果 SSN 匹配是绝对要求,我认为您可以采取一些步骤来降低风险:
同样,您最好的选择可能只是找到一种完全不同的方法来做到这一点,而无需使用 SSN。但是,如果这是绝对的业务要求,那么上述步骤可以大大保护您客户的个人数据。尽管如此,我也会检查您所在行业的监管要求,以确保您遵守所有适用的规则。