我有一个具有未加密字段的大型数据库。
这些数据非常敏感,管理人员决定尽快对它们进行加密。并且所有新数据应以相同方式自动加密。
第一种方法:
如果使用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_RIJNDAEL_128的mcrypt_encrypt等效于aes_encrypt
,然后在不让MySQL做加密部分的情况下将加密变量插入查询中,这将减少负载和处理时间。
但是mcrypt_encrypt
isn't secure anymore,特别是在ECB
模式下。
最好的方法是对现有的MySQL数据库中的几个字段进行加密,当然,对新字段进行加密?而且,如果我在CFB模式下使用了mcrypt,以后可以使用aes_decrypt来检查数据吗?
最好的方法是,对现有的MySQL数据库中的几个字段进行加密,当然,对新字段进行加密?
[编写一个PHP脚本,该脚本可读取您的数据库并在应用程序层(即,在PHP中)而不是数据库层(即,不在SQL中)进行加密。立即将它们全部加密,并让您的脚本适当地加密新字段。
但是现有数据将与无法在MySQL查询中使用libsodium的数据相同。
libsodium不可用于MySQL的事实完全不应该成为障碍。毕竟,您不希望数据库有机会窃取密钥。 MySQL仅应看到不透明的密文blob。
您不应该尝试使用SQL查询进行加密。在SQL外部执行此操作,并用密文替换字段。然后,当您的过程完成时,请确保没有在任何地方缓存纯文本。
如果尝试对整个数据库进行加密,则最终可能要使用WHERE
查询的SELECT
子句中的某些字段。欢迎使用可搜索对称加密。这里有很多疯狂的学术设计(保留顺序的加密,同态加密等)。
对于此用例,我建议CipherSweet。它快速,安全,易于解释,并且不需要安装任何第三方C扩展来从PHP使用。