在不使用 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_encrypt
isn'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 中写入大量数据
Android:如何在不使用 JDBC、PHP 或任何其他网络服务的情况下将数据发送到 MySQL DB? [复制]