3

我有一个 MySQL 表,我在其中存储使用openssl.

假设我有一个名为friendsfields的 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总是为相同的输入返回不同的值。所以我无法复制第一个加密值。

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

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

4

1 回答 1

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(),传递您的密钥。

于 2013-06-29T00:53:12.617 回答