【问题标题】: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 来检查数据吗?

【问题讨论】:

    标签: php mysql encryption mcrypt libsodium


    【解决方案1】:

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

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

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

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

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

    警告

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-08
      • 2011-05-26
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      相关资源
      最近更新 更多