防止对有限的值集进行前像攻击

时间:2010-11-29 09:13:11

标签: hash sha256

我已经询问过对社会安全号码的哈希进行原像攻击的成本。 The excellent answer我得到的是,社会安全号码的类型只有366,000,000个哈希值,这样可以轻松进行原像攻击。

我现在的问题是是否可以完全避免原像攻击。我的情况是,有几个客户需要将社会保险号存储在中央服务器上。散列必须在客户端之间保持一致。客户可以与在线Web服务进行通信。

1 个答案:

答案 0 :(得分:1)

您的问题类似于使用密码时必须执行的操作。密码适合人类的大脑,因此,猜测起来并不困难。

使用低熵秘密时,有两种互补的方法可以降低风险:

  • 使用迭代/重复哈希使攻击者的每次“猜测”都更加昂贵。
  • 使用盐来防止成本分摊。攻击者应为每个受攻击的密码/ SSN支付完整的字典搜索攻击。

使散列更加昂贵的一种方法是散列数据的 n 副本的串联,并使 n 尽可能大(取决于计算能力)客户,最终是用户的耐心)。例如,对于(虚拟)SSN“123456789”,请使用 H(123456789123456789123456789 ... 123456789)。你会在这里计算数百万的 n ;在基本的PC上,SHA-256可以轻松处理每秒一百兆字节。

salt 是一条公共数据,沿着数据用于散列(SSN),并且对于每个用户而言是不同的。盐不需要保密,但不应重复使用(或至少不经常使用)。由于SSN往往是永久性的(一个人一生都有一个独特的SSN),那么你可以使用用户名作为盐(这与用户可以更改密码的密码形成对比,并且应该为每个人使用新的盐新密码)。因此,如果用户Bob Smith拥有SSN 123456789,您最终将使用: H(“Bob Smith 123456789 Bob Smith 123456789 Bob Smith 123456789 ... Smith 123456789”)并且有足够的重复次数以使该过程充分慢。

假设您可以让用户在一台不那么新的计算机上等待一秒钟(很难让用户等待更多),可以预期即使是坚定的攻击者也会遇到麻烦。每秒几百SSN。破解单个SSN的成本将在几周内计算,并且,由于使用用户名作为盐,攻击者将没有捷径(例如,盐析击败预先计算的表,包括大肆宣传的“彩虹表”)