【发布时间】:2011-08-31 13:33:12
【问题描述】:
我有一个项目需要在前端验证美国社会安全号码(格式 ddd-dd-dddd)。一个建议是使用散列算法,但考虑到使用的字符集很小 ([0-9]),这将是灾难性的。以高概率验证数字是否正确并允许后端进行最终的== 检查是可以接受的,但我需要做得比“有九位数字”等要好得多。
在寻找更好的替代方案时,我发现了 ISBN 数字和 UPC 的验证校验和。这些看起来是一个很好的选择,在前端成功的可能性很高。
鉴于这些限制,我有三个问题:
- 有没有办法证明像 ISBN13 这样的算法可以处理不同类别的数据(如 SSN),或者从安全角度来看它是否或多或少符合目的?对于我相当大的一个真实 SSN 样本,校验和似乎是合理的,但我不想发现它们由于某种原因通常不适用。
- 这是在某个地方解决的问题,以便我可以简单地使用预先存在的验证方案来解决问题吗?
- 是否有任何此类算法也可以轻松地验证 SSN 的最后 4 位数字而不放弃太多额外信息?
一如既往的感谢, 乔
更新:
回答下面的问题,更详细一点。我有之前输入的客户 SSN,安全地存储在应用程序的后端。我需要做的是验证(尽最大可能)客户在 this 页面上再次输入了相同的值。问题是我需要防止信息被意外透露给前端,以防某些未经授权的人能够访问该页面。
这就是为什么 MD5/SHA1 散列是不合适的:即它可以用来毫无困难地推导出完整的 SSN。校验和(例如,模 11)几乎不向前端提供任何信息,同时仍然允许现场验证的高度准确性。但是,如上所述,我对其普遍适用性感到担忧。
【问题讨论】:
-
为什么使用 sha1 会是灾难性的?
-
@Nick 这将是灾难性的,因为你可以很快地暴力破解这么大的数字。此外,SSN 是一种固定格式,因此并非所有数字都有效,从而进一步减少了搜索量。现代硬件(尤其是 GPU)可以快速计算大量哈希,因此这对于个人识别信息的安全性不足。
-
我对这个问题有些困惑。你不是以明文形式传输 SSN 吗?
-
@Joseph 谢谢,我现在对这个问题有了更好的理解。不过,我担心你提出的任何算法的信息泄露。例如,一个简单的 mod 11 校验和仍然会“泄漏”SSN 搜索空间 10:1 的减少——这种泄漏(对于每个用户)是否值得在用户错误输入 SSN 的不太常见的情况下节省少量往返行程?就个人而言,我会进行最少的客户端验证(即 9 位数字等),然后进行正常的服务器端验证。简单且没有信息泄露的可能性。如果偶尔用户需要重新提交,那就这样吧。
-
我同意埃里克的观点。听起来像过早的优化。只需使用 Regex,您就可以在前端进行基本的完整性检查,甚至是一些特定于 SSN 的模式验证。然后做一个完整的验证 - 无论如何你最终都必须这样做,一个检查像 SSN 之类的东西的功能可能会导致一个不同的页面,大多数客户可能会在第一时间得到他们的 ssn。所以它只是偶尔的往返被保存。往返旅行和网络应用程序 - 这是生活中的事实。您的应用中肯定还有其他更值得优化的地方吗?
标签: algorithm security validation