在不使用 mysql 服务器资源的情况下加密数据的最佳方法是啥?使用 CFB 模式的 mcrypt 是使用 php 的最佳方式吗?

Posted

技术标签:

【中文标题】在不使用 mysql 服务器资源的情况下加密数据的最佳方法是啥?使用 CFB 模式的 mcrypt 是使用 php 的最佳方式吗?【英文标题】:What is the best way to encrypt data without using the resource of mysql server ? Is mcrypt with CFB mode the best way with php?在不使用 mysql 服务器资源的情况下加密数据的最佳方法是什么?使用 CFB 模式的 mcrypt 是使用 php 的最佳方式吗? 【发布时间】:2019-06-09 05:06:16 【问题描述】:

我有一个包含非加密字段的庞大数据库。

这些数据很敏感,管理人员决定尽快对它们进行加密。并且所有新数据都应该以相同的方式自动加密。

第一种方法

如果我使用aes_encrypt 创建一个新字段并将加密数据插入其中,如下所示:

INSERT INTO myTable(name_en, name_es, phone)
VALUES(aes_encrypt(name_en, :key), aes_encrypt(name_es, :key), aes_encrypt(phone, :key))

之后,每个插入查询都应该使用aes_encrypt(),这对服务器来说是资源丰富的。​​

第二种方法

使用libsodium 库,这是一个很好的新数据解决方案。但现有数据将保持与libsodium couldn't be used inside a mysql Query 相同。

第三种方法

使用 mcrypt_encrypt 和 MCRYPT_RIJNDAEL_128 作为 aes_encrypt 的等价物,然后将加密的变量插入到查询中,而不让 MySQL 做加密部分,这将减少负载和处理时间。

但是mcrypt_encryptisn't secure anymore,特别是ECB模式。

最好的方法是加密现有 MySQL 数据库中的几个字段,当然还有新的?如果我在 CFB 模式下使用 mcrypt,之后可以使用 aes_decrypt 来检查数据吗?

【问题讨论】:

【参考方案1】:

最好的方法是加密现有 MySQL 数据库中的几个字段,当然还有新的?

编写一个 php 脚本,它读取您的数据库并在应用程序层(即 PHP)而不是数据库层(即不在 SQL)进行加密。一次加密它们,并让您的脚本有机会加密新字段。

但现有数据将保持不变,因为 libsodium 无法在 MySQL 查询中使用。

libsodium 对 MySQL 不可用这一事实根本不应该成为阻碍。毕竟,您不希望您的数据库有机会窃取您的密钥。 MySQL 应该只看到不透明的密文 blob。

您不应该尝试使用 SQL 查询进行加密。在 SQL 之外执行此操作并用密文替换字段。然后当你的过程完成后,确保你没有在任何地方缓存明文。

警告

如果您尝试加密整个数据库,您可能最终希望使用SELECT 查询的WHERE 子句中的某些字段。欢迎使用可搜索的对称加密。这里有很多疯狂的学术设计(保序加密、同态加密等)。

对于这个用例,我推荐CipherSweet。它快速、安全、易于推理,并且不需要安装任何第三方 C 扩展即可从 PHP 中使用。

【讨论】:

以上是关于在不使用 mysql 服务器资源的情况下加密数据的最佳方法是啥?使用 CFB 模式的 mcrypt 是使用 php 的最佳方式吗?的主要内容,如果未能解决你的问题,请参考以下文章

NestJS + MySQL:如何在不设置实体的情况下连接多个数据库

如何在不使用临时文件的情况下在 python 的 tarfile 中写入大量数据

Laravel 在不破坏身份验证的情况下加密用户电子邮件

Android:如何在不使用 JDBC、PHP 或任何其他网络服务的情况下将数据发送到 MySQL DB? [复制]

如何在不停止Mysql服务的情况下,定时备份mysql数据库

如何在不使用 Django 模型的情况下使用 MySQL 中的完整数据库