繁体   English   中英

在不使用 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?

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

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

第一种方法

如果我使用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 不能在 MySQL Query 中使用

第三种方法

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

但是mcrypt_encrypt 不再安全,特别是在ECB模式下。

加密现有 MySQL 数据库(当然还有新数据库)中的几个字段的最佳方法是什么? 如果我将 mcrypt 与模式 CFB 一起使用,之后可以使用 aes_decrypt 来检查数据吗?

加密现有 MySQL 数据库(当然还有新数据库)中的几个字段的最佳方法是什么?

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

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

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

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

警告

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM