mysql - 使用 openssl 加密字段过滤 MySQL 表

标签 mysql openssl

我有一个 MySQL 表,我在其中存储使用 openssl 加密的数据。

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

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

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

现在我的问题来了。假设我需要找到所有包含 name = 'carlos'

的记录

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

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

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

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

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

最佳答案

那是行不通的,因为 openssl_public_encrypt() 对相同名称的输出每次都会不同。

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

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

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

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

如果你觉得偏执,你也可以使用键控哈希,使用 hash_hmac() ,传递您的 key 。

关于mysql - 使用 openssl 加密字段过滤 MySQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17375559/

相关文章:

c++ - 如何以编程方式从 PKCS7 中提取 CA、多个 CA 和公共(public)证书/ key ?

mysql - 使用外键创建表不起作用?

mysql - 插入具有重复键和不同更新的多个值

php - MYSQL查询开始时间和结束时间

MySQL基于多个计数的选择

bash - 映射SSL/TLS密码套件及其等效的OpenSSL

PHP 登录脚本总是打印 "wrong username or password"

c++ - OpenSSL私钥读取错误(PEM_read_bio_RSAPrivateKey)

仅使用 RSA 和 AES 构建 openssl

python - 如何在 PyCrypto 中使用 X509 证书?