散列SSN和其他有限域信息

Pre*_*all 13 security encryption hash privileges cryptography

我目前正在开发一个我们收到私人健康信息的应用程序.其中一个最大的问题是SSN.目前,我们不会将SSN用于任何事情,但将来我们希望能够使用它来跨多个设施唯一地识别患者.我可以看到可靠的唯一方法是通过SSN.但是,我们(除了我们的客户)真的不想存储SSN.

很自然地,我想只是SHA哈希它,因为我们只是用它来识别.问题在于,如果攻击者知道问题域(SSN),那么他们可以专注于该域.因此,计算十亿个SSN而不是几乎无限数量的密码要容易得多.我知道我应该使用站点盐和每个患者的盐,但是我还能做些什么来防止攻击者暴露SSN?而不是SHA,我计划使用BCrypt,因为Ruby有一个很好的库,它可以自动处理可扩展的复杂性和盐析.

它不会被用作密码.从本质上讲,我们从许多设施获取信息,每个设施都描述一名患者.唯一接近患者全球唯一标识符的是SSN号码.我们将使用哈希来识别多个设施中的同一患者.

roo*_*ook 7

用于生成社会安全号码的算法是在黑客的概念之前创建的,因此它们是非常可预测的.使用SSN进行身份验证是一个非常糟糕的主意,使用什么加密原语或盐值有多大并不重要.在一天结束时,你想要保护的"秘密"没有太多的熵.

如果您永远不需要知道纯文本,那么您应该使用SHA-256.SHA-256是一个非常好的用于密码的功能.


Sla*_*ast 6

如果您确实想以安全的方式对社会安全号码进行哈希处理,请执行以下操作:

  1. 找出 SSN 中的熵有多少(提示:非常少。远小于随机选择的 9 位数字)。
  2. 使用任何哈希算法。
  3. 保留比 SSN 中的熵少(一半?)的位。

结果:

  • 优点:由于存在大量哈希冲突,因此可以确保 SSN 的安全哈希。
  • 优点:您的哈希值很短且易于存储。
  • 缺点:哈希冲突。
  • 缺点:由于缺点#1,您不能将其用作唯一标识符。
  • 优点:这很好,因为除非您是社会保障管理局,否则您确实不需要使用 SSN 作为标识符。