SSN的校验和

问题描述

| 我有一个项目需要在前端进行美国社会安全号码(格式
ddd-dd-dddd
)的验证。一种建议是使用哈希算法,但是考虑到使用的字符集很小(
[0-9]
),这将是灾难性的。以高概率验证数字是否正确并允许后端进行最终的“ 2”校验是可以接受的,但是我需要做得比“具有九位数”等要好得多。 在寻找更好的替代方案时,我遇到了ISBN号和UPC的验证校验和。这些看起来像是一个很好的替代方案,在前端成功的可能性很高。 鉴于这些限制,我有三个问题: 有没有办法证明像ISBN13这样的算法可以与像SSN这样的不同类别的数据一起工作,或者从安全角度来看,它是否或多或少地适合该目的?对于我的一个真实SSN的大量样本而言,校验和似乎是合理的,但是我不愿意发现它们由于某些原因通常不适用。 这是否在某个地方解决了问题,以便我可以简单地使用预先存在的验证方案来解决问题? 是否有任何这样的算法可以轻松地验证SSN的后4位,而又不会浪费太多额外信息? 一如既往的感谢 乔 更新: 为了回答下面的问题,我们将提供更多细节。我已经输入了客户的SSN,并将其安全存储在应用程序的后端。我需要做的是(最大程度地)验证客户是否已在此页面上再次输入了相同的值。问题是,如果某些未经授权的人能够访问该页面,我需要防止将该信息偶然泄露给前端。 这就是为什么不使用MD5 / SHA1哈希的原因:即可以将MD5 / SHA1哈希毫无困难地用于导出完整的SSN。校验和(例如,模11)几乎不向前端提供任何信息,同时仍允许用于字段验证的高度准确性。但是,如上所述,我对它的普遍适用性感到担忧。     

解决方法

重申您的基本要求: 较强的校验和,可以防止简单的人为错误。 从服务器->客户端发送\“期望\”校验和,允许客户端验证。 校验和不得泄露太多有关SSN的信息,以最大程度地减少敏感信息的泄漏。 我可能会建议使用加密的has(例如SHA-1等),但不要将完整的哈希值发送给客户端。例如,仅发送160位哈希结果[1]的最低4位。通过发送4位校验和,您发现数据输入错误的机会为15/16,这意味着您将在93%的时间内检测到错误。但是,不利的一面是,您“泄漏了”足够的信息以将其SSN减少到搜索空间的1/16。您应自行决定是否值得利用客户端验证的便利性来解决这种泄漏。 通过调整发送的“校验和”位数,您可以在对用户的便利性(即检测错误)和信息泄漏之间进行调整。 最后,根据您的要求,我怀疑这种便利性/泄漏权衡是一个固有的问题:当然,您可以使用更复杂的加密挑战/响应算法(正如Nick ODell所建议的那样)。但是,这样做将需要单独的往返请求-您最初说的是要避免的事情。 [1]在一个好的加密散列函数中,由于雪崩效应,所有输出数字都被很好地随机化了,因此您选择的特定数字并不重要-它们都是有效随机的。     ,Wikipedia并非此类事情的最佳来源,但请注意,http://en.wikipedia.org/wiki/Social_Security_number表示   与许多相似的数字不同,不包含校验位。 但在此之前,它提到了一些广泛使用的过滤器:   SSA发布每个区域号使用的最后一个组号。由于组号是按常规(如果异常)模式分配的,因此有可能识别出包含无效组号的未发行SSN。尽管采取了这些措施,仅使用公开可用的信息仍无法轻易检测到许多欺诈性SSN。为此,有许多提供SSN验证的在线服务。     ,简单的解决方案。将数字mod 100001作为您的校验和。您有1 / 100_000的机会错误地用错误的数字正确地获得了校验和(这将非常有助于抵销一位或两位数的错误),以及10,000个可能的SSN,因此您没有透露攻击者的SSN。 唯一的缺点是很容易找出10,000个可能的其他SSN。如果该人可以从其他地方获得SSN的最后4个,那么他们很可能可以算出SSN。如果您对此有所担心,则应该获取用户的SSN编号,添加一个盐,然后对其进行哈希处理。并故意使用昂贵的哈希算法来做到这一点。 (您可以迭代固定次数的廉价算法(例如MD5),以增加成本。)然后仅使用一定数量的位。这里的意思是,尽管某人当然可以通过所有十亿个可能的SSN来提出一个有限的可能性列表,但这样做将使他们付出更多的代价。希望他们不会打扰。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...