我有一个接受社会安全号码的表格,我需要编写代码来检查它是否在过去两天内输入。这一切都很容易。
我目前的计划是创建一个表ssn_hash(id, ssn_hash, date)
并对ssn进行哈希/加盐,然后将它们插入数据库。之后,创建一个显示过去两天的视图。盐是从表单中获取的其他用户数据。
我想知道两件事:
- 这是一个好方法吗?还是有其他一些常见的做法可以达到相同的结果。
- 在 PHP 下,std 库中唯一的选项是 crypt() 函数吗?
crypt
完全可以,但有以下警告:
- 如果您将用户数据用作盐,则会严重限制其随机性。 选择类似
openssl_random_pseudo_bytes
的东西。 - 不要害怕将盐存放在桌子上。 事实上,
attr_encrypted
,一个流行的Ruby on Rails宝石就是这样做的。 只要确保为每个条目生成一个独特的盐。 切勿重复使用盐。 - 确保不使用损坏的加密方法,如 DES 或 SHA-1。 您可以指定
CRYPT_BLOWFISH
或CRYPT_SHA512
。
如果您需要快速查找以查看该号码是否已被使用,密码加密功能在这里对您没有帮助。相反,您必须使用直接的 SHA1 类型哈希,以便您可以进行反向查找。
您需要绝对确定您的服务器已正确保护。定期从此表中清除数据可能也是一个好主意。