使用openssl-encrypted字段过滤MySQL表

时间:2013-06-29 00:37:11

标签: mysql openssl

我有一个MySQL表,用于存储用openssl加密的数据。

假设我有一个名为friends的MySQL表,其中包含字段id, name, surname

我只想加密字段name。所以我使用openssl_public_encrypt对其进行加密,然后将其保存在表中。这很好。

当我需要阅读记录时,我选择它并使用name解密openssl_private_decrypt并且我可以阅读它。它也可以正常工作。

现在这是我的问题。假设我需要找到name = 'carlos'

的所有记录

我做的第一件事(我是openssl的初学者)是加密'carlos'并使用该值作为条件:

<?php
    openssl_public_encrypt('carlos', $encrypted, $myPublicKey);
    $query = 'SELECT * FROM friends WHERE name ="' . $encrypted . '"; ';
?>

但后来我意识到openssl_public_encrypt总是为同一输入返回一个不同的值。所以我无法复制第一个加密值。

现在我认为不可能将该字段用作条件。

问题:有没有办法可以使用openssl加密字段作为MySQL中的条件进行过滤?

1 个答案:

答案 0 :(得分:1)

这不起作用,因为同一名称openssl_public_encrypt()的输出每次都会有所不同。

对于可搜索的字段,您可以考虑使用SHA1或MD5甚至添加该字段的散列列,该列始终为同一名称生成相同的值:

$hashed_name = sha1('carlos');
$query = sprintf("SELECT * FROM friends WHERE name_hashed = '%s'", $hashed_name);

为了确保没有哈希冲突,您还需要检查查询结果中的每一行。

最大的缺点是,对于每个INSERT和UPDATE语句,您还必须维护散列版本。

如果您感到偏执,您还可以使用密钥哈希,使用hash_hmac(),传入您的密钥。