用作标识符时如何散列社会保险号

How To Hash Social Security Numbers When Used As Identifiers

我有一项服务可以让用户为他们的大家庭在线存储信息(例如消息、视频等),以便在他们去世时共享。 Ex - 当我路过时,把这个视频发给我侄子,告诉他我爱他。

我有一个 JSON 结构化数据库,它存储用户的社会安全号码作为他们个人资料的标识符。

 $salted_hashed_ssn: {
    //important information for extended family such as vidoes and email addresses
   }

当一个用户去世时,他们最亲近的家庭成员会去我的网站并输入死者的社会安全号码。然后我对这些进行哈希处理,看看是否在我的数据库中进行了匹配。如果匹配成功,我们将 运行 发挥作用,为大家庭分享重要信息。

做最坏的打算,我想尽可能安全地存储社会安全号码。因为我只需要使用社会安全号码作为标识符,所以我不必存储 raw/plain 文本 ssn 值。因此,我可以对 ssns 进行哈希处理,但我需要对它们进行加盐以防止查找表。我的问题是,当用户输入已故用户的社会安全号码时,我无法查看使用了哪个盐密钥。

为了使其随机并防止查找表,您建议我如何加盐我的社会安全号码?我应该每次只取 x 个字符吗?即 - 始终抓取社会安全号码的前 4 个字符,对它们进行哈希处理,然后将它们计算为完整的 SSN,然后重新进行哈希处理?

令 salted_hashed_ssn = SHA256(SSN 的前 4 个字符) + SHA256(SSN) ?

您建议如何设置 salt 和 hash?

您可以像对待密码一样对待您的 SSN。请记住,盐不必是秘密的,它只需要每个条目 不同。所以只需将盐与哈希一起存储,这是绝对安全的。

不过,我不建议在这里使用 SHA256。请改用 bcrypt。它为您处理盐,这意味着您无论如何都不需要担心上面的建议。它也更能抵抗暴力破解。 SHA 系列不是为您使用它的方式进行散列而设计的。