Laravel对散列/加密值的唯一验证

时间:2014-09-08 15:03:15

标签: php validation encryption hash laravel-4

我正在使用Laravel 4.2。

我创建了一个注册表单,用户填写了他们的姓名和电子邮件地址,成功验证后,然后使用Crypt::encrypt()作为加密值存储在数据库中,用于电子邮件字段和{{1} }用于密码字段。

我的问题是为电子邮件过滤器生成验证规则,该规则对于每个注册的用户都必须是唯一的。

Hash::make()Crypt::encrypt()每次为同一个输入字符串生成随机字符串,我似乎无法将输入值与数据库中的值匹配,即使它们可能是相同?

将电子邮件地址(或其他字段)验证为必须始终在数据库中加密时,最佳做法是什么?

另外,我如何修改我的Hash::make()功能以适应电子邮件字段已加密的事实?

1 个答案:

答案 0 :(得分:0)

我假设您使用Crypt::encrypt()加密了电子邮件地址,并且由于该方法每次都会生成不同的IV,因此结果无法比较。

每当您需要可搜索/可比较字段时,您不能使用IV(加密)或盐(散列)。解决此问题的一种方法是使用电子邮件和服务器端密钥作为输入计算HMAC,但没有盐。您可以将此哈希与加密电子邮件并排存储。

如果攻击者知道服务器端密钥,他将能够强制执行电子邮件哈希,但之后他也可能知道加密密钥并可以直接解密电子邮件。请注意,这不适用于密码,因为它们应该存储不可恢复。