【问题标题】:Storing scrambled Social Security numbers存储加扰的社会安全号码
【发布时间】:2013-05-04 08:46:45
【问题描述】:

我需要以唯一的加扰状态存储社会安全号码...

原因:我需要社交号码,但我不想将它们打开以防数据库遭到破坏。

我想将社会安全号码转换为字母数字字符串,我更喜欢这是一个单向过程。(不可逆)

然后,当我搜索现有的 SSN 号码时,我会再次使用相同的算法进行用户输入,打乱 SSN 并使用字母数字字符串搜索数据库。

在 php 中,我可以做类似的事情

function maskSSN($SSN) {
    $salt = sha1(md5($SSN));
    $SCRAM = md5($SSN . $salt);
    return $SCRAM;
}

但我认为这不会产生独特的价值

【问题讨论】:

  • 任何散列函数都有冲突。 SSN号有什么格式?
  • 嗯,每个 SSN 号码都是唯一的,有 9 位数字
  • 当你知道散列函数时,任何形式的暴力破解都很容易。在 9 位 SSN 上不太可能发生冲突。您可以暴力破解所有 SSN 号码并检查结果的唯一性

标签: security encryption encoding scramble


【解决方案1】:

对于像 SSN 这样熵少的东西,我不建议将它们存储为未加密或散列。如果攻击者窃取您的数据库,暴力破解 SSN 将是非常可行的。

相反,您应该使用 AES-256 或更好的方式加密 SSN。查看此 SO 问题,了解有关正确存储加密密钥的更多信息:Storing encryption keys -- best practices?

【讨论】:

    【解决方案2】:

    如果您可以存储完整的散列(未截断),则不应与使用最安全散列的 9 位 SSN 发生任何冲突。

    为了防止哈希值被暴力破解,请使用带有密钥的 HMAC-Sha1 或 HMac-Sha256。这是一个涉及电话号码和匿名数据的相关答案https://stackoverflow.com/a/15888989/637783

    如果不解密,AES-256 结果将无法在以后使用,因为正确且安全地使用 AES-256 会为相同的输入产生不同的结果。但是,它可以在关系表中合理使用,其中您的 ssn 已加密并针对其他表引用该键的主键存储。

    随着时间的推移,后面的选项也允许您非常简单地旋转您的密钥。

    【讨论】:

    • 但是如果数据库被盗怎么办?那么 HMAC 对暴力破解毫无用处。请注意,HMAC 仅用于保护完整性和身份验证,而不是机密性。
    • 使用 HMac,数据库被盗,除非您也获得密钥,否则您不能暴力破解,就像使用 AES 一样,如果您也拥有密钥,那么您只有数据。但是,我认为这是一个无关紧要的区别,因为暴力破解 ssns 仅比 aes 解密稍微不那么简单。此外,Hmac 被设计为PRF,因此它实际上旨在不泄露有关明文的信息。此外,OP 主要关注搜索,而 AES(安全实现)在这方面效率最低。
    猜你喜欢
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多