有许多问题讨论使用加密在MYSQL中存储敏感信息。有些人对加强Web服务器,数据库服务器和Web应用程序(Store 'sensitive' data in MySQL DB)提出了很好的建议。但是,关于MYSQL的AES_Encrypt和AES_Decrypt功能的确切实现,除了几个涉及使用技术问题的问题(How to use AES_ENCRYPT and AES_DECRYPT in mysql)之外,几乎没有讨论过。
我正在使用下面的MYSQL预处理语句来加密敏感信息:
userAmount(){
let item =Items.findOne({_id:this._id,'cart.user':Meteor.userId()});
let amount ='';
if(item){
item.cart.filter(function (cart) {
if(cart.user ==Meteor.userId()){
amount =Number(cart.amount);}else{amount=0;}
}
}else{amount=0;}
return amount;
}
我使用具有相同SHA2字符串的AES_DECRYPT函数在需要时解密数据。我理解这一点的方式,没有人访问Web服务器本身或找出SHA2密码短语,他们无法轻松访问这些敏感数据。例如,获得数据库服务器访问权限的人无法帮助他们解释这些敏感数据。
我有几个问题:
感谢。
答案 0 :(得分:3)
不要将AES_ENCRYPT()
用于数据安全性。如果您的应用程序包含必须加密存储的敏感数据,则应在应用程序中实现加密和解密(即,在PHP代码中)。
AES_ENCRYPT()
存在几个主要问题:
加密密钥传输到MySQL服务器。查询运行时,SHOW PROCESSLIST
中的其他客户端可以看到它。此外,如果启用了常规日志或慢速查询日志记录,则可以将密钥写入这些日志。
如果您没有使用SSL连接到MySQL - 您可能不会 - 加密密钥和敏感数据的明文都将通过网络传输,并且可能会被截获那里。
许多常用的MySQL版本(早于5.7.4)仅支持ECB模式。 ECB is insecure
在PHP中实施加密时,不要使用mcrypt 。它是错误的,没有维护的,并且在PHP 7.1中被弃用(并且可能在以后的版本中完全删除)。理想情况下,您应该使用一个尽可能多地封装加密的库(如libsodium);如果不这样做,请使用OpenSSL扩展中可用的加密原语。