具有可比结果的双向加密

时间:2015-09-20 12:49:52

标签: php laravel encryption

我使用Laravel Crypt::encrypt("text")加密文本,但每次我得到不同的结果。我希望在数据库中比较加密结果。

$sql = 'SELECT * FROM users WHERE `encrypted_field` = "'.Crypt::encrypt('text').'"';

但是因为Crypt::encrypt('text')每次都返回不同的结果,所以查询什么也不返回。

如何处理这个问题?

2 个答案:

答案 0 :(得分:2)

这取决于你想做什么:

如果您想在将来解密某些内容,可以使用

$encrypted = Crypt::encrypt('foobar');
$decrypted = Crypt::decrypt($encrypted); //returns foobar

在这种情况下,加密值每次都会改变。但请记住:如果您更改了应用密钥,则无法使用它来解密旧字符串。

但如果你只需要哈希,例如如果密码始终相同,那么您可以使用

$password = Hash::make('secret');
$password = bcrypt('secret'); // same as Hash::make

要将散列与非散列单词进行比较,您可以使用

if (Hash::check('secret', $hashedPassword))
{
    // The passwords match...
}

答案 1 :(得分:0)

直接而直接的答案是,你不能。不要试试,你只会降低自己的安全性。

但是,您可以通过我调用blind indexing的过程安全地索引加密信息。

  1. 逐字存储加密数据,不要做任何事情来降低加密的安全性。的重视。
  2. 在您的PHP代码中,计算hash_hmac('sha256', $unencryptedData, $someVeryUnguessableKey)
  3. 使用此HMAC进行索引和比较。
  4. 这允许您以盲目的方式执行查找,而不必削弱加密。但是,请注意,所述设计并非不受时间攻击的影响,并且务必记录并限制每次访问数据的尝试(无论是否成功)。