Security 哈希SSN和其他有限域信息

Security 哈希SSN和其他有限域信息,security,encryption,cryptography,hash,privileges,Security,Encryption,Cryptography,Hash,Privileges,我目前正在开发一个应用程序,我们可以从中获得私人健康信息。最大的担忧之一是SSN。目前,我们没有将SSN用于任何用途,但将来我们希望能够使用它在多个设施中唯一地识别患者。我能看到的唯一可靠的方法是通过SSN。但是,我们(除了我们的客户之外)确实不想存储SSN 所以很自然,我想把它散列,因为我们只是用它来识别。问题在于,如果攻击者知道问题域(SSN),那么他们可以将注意力集中在该域上。因此,计算10亿个SSN比计算几乎无限数量的密码要容易得多。我知道我应该使用站点salt和每位患者salt,但我还

我目前正在开发一个应用程序,我们可以从中获得私人健康信息。最大的担忧之一是SSN。目前,我们没有将SSN用于任何用途,但将来我们希望能够使用它在多个设施中唯一地识别患者。我能看到的唯一可靠的方法是通过SSN。但是,我们(除了我们的客户之外)确实不想存储SSN

所以很自然,我想把它散列,因为我们只是用它来识别。问题在于,如果攻击者知道问题域(SSN),那么他们可以将注意力集中在该域上。因此,计算10亿个SSN比计算几乎无限数量的密码要容易得多。我知道我应该使用站点salt和每位患者salt,但我还能做些什么来防止攻击者泄露SSN?我计划使用BCrypt而不是SHA,因为Ruby有一个很好的库,它可以自动处理可伸缩的复杂性和salt


它不会被用作密码。从本质上讲,我们从许多机构获得信息,每个机构描述一名患者。唯一接近患者全局唯一标识符的是SSN编号。我们将使用散列来识别多个设施中的同一患者。

生成社会安全号码的算法是在现代黑客概念出现之前创建的,因此它们是。使用SSN进行身份验证是一个非常糟糕的主意,它实际上与您使用的加密原语或salt值有多大无关。最终,你试图保护的“秘密”没有多少熵


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

首先,对于存储SSN的散列,我们表示热烈的掌声和赞扬

似乎您将SSN保留为一种“备份用户名”。在这种情况下,您需要用户名之外的另一种身份验证形式—密码、驾照号码、护照号码、居住证明等

此外,如果您担心攻击者会预测1984年出生于亚利桑那州的患者的前10000个SSN,并尝试每个SSN,那么您可以在应用程序中加入一个成倍增加的速率限制。*以进行额外防御,内置一个通知系统,当出现异常多的登录尝试失败时,会向系统管理员发出警报**

*指数递增速率限制器示例: 在每个失败的请求之后,将下一个请求延迟(1.1^N)秒,其中N是来自该IP的失败请求数。在DB表中跟踪IP和失败的登录尝试;不应该根据应用程序的受众(你为谷歌工作吗?)增加太多负载


**如果攻击者可以访问多个IP,该通知将提醒系统管理员,系统管理员可以根据自己的判断判断您是否有愚蠢的用户涌入,或者这是一次恶意尝试。

如果您真的想以安全的方式散列一个社会保险号码,请执行以下操作:

  • 找出熵是多少 SSN(提示:几乎没有。 远低于随机选择的9 数字)
  • 使用任何哈希算法
  • 保留少于(一半?)位 SSN中存在熵
  • 结果:

    • Pro:由于以下原因,SSN的安全哈希 大量哈希冲突
    • 赞成:你的散列很短,很容易存储
    • 缺点:散列冲突
    • 缺点:你不能把它用于一个独特的目的 由于Con#1而导致的标识符
    • 赞成者:那很好,因为你真的 确实不需要将SSN用作 除非你是社会的一员 安全管理

    您可能不希望以这种方式使用SSN:人们可能会在表单上写错,也可能会。我支持sarnold。我已经看到SSN信息的使用失败得很惨——另一种情况是没有(立即)可用的SSN。这是一个很好的观点,但这更像是一个模糊的解决方案,它不必100%正确。此外,如果没有可用的SSN,那么该功能将无法为该患者工作。唯一的另一个建议是使用他们的保险信息,这在准确性和可用性方面有其自身的问题。如果您计划使用HMAC,因为使用私钥进行散列的原始前置或附加策略存在漏洞。它不会用作密码。从本质上讲,我们从许多机构获得信息,每个机构描述一名患者。唯一接近患者全局唯一标识符的是SSN编号。我们将使用散列来识别多个设施中的同一患者。存储SSN的长散列不得分/鼓掌/表扬。它在功能上等同于存储SSN。@slartibarfast:功能上等同于是。如果他们的数据库遭到破坏或被盗,他只是阻止公司泄露身份信息。@BenWalther阻止了吗?没有,耽搁了吗?是的,大约15秒。SHA-256是一个很好的散列函数,但是对于这种情况,它太快了。我需要一些可以控制复杂性的东西,比如bcrypt或PBKDF2。我担心的是,即使有了所有的salting功能,它仍然不足以防止反转。@Preston Marshall如果你想要一个慢速消息摘要功能,那么你就会对它们为什么如此有用感到困惑。NIST永远不会批准慢消息摘要功能。关键是函数在一个方向上非常快,但是反向计算非常复杂。暴力问题应该用salt来解决。@Preston Marshall当实际值小于9999时,使用加密函数并不重要