在MYSQL中对敏感数据使用AES加密 - 实施问题

时间:2016-12-19 01:14:29

标签: mysql security encryption cryptography aes

有许多问题讨论使用加密在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密码短语,他们无法轻松访问这些敏感数据。例如,获得数据库服务器访问权限的人无法帮助他们解释这些敏感数据。

我有几个问题:

  1. 我在这里阅读了关于Init Vector的文章:http://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html。我不太明白这是如何工作的,或者它是否应该被实现。什么是Init Vector,它是否有助于提高我上面使用的加密方法的安全性?
  2. 我很不舒服在加密和解密这些数据的文件中使用SHA2密码短语。是否有另一种方法对其进行编码,使其位于公共目录下的文件中?
  3. 该系统的一个缺陷是,如果有人劫持了Web应用程序,他们仍然可以通过运行解密信息的脚本来访问这些敏感数据。虽然我有强大的访问控制,如果这也被规避,我正在考虑数据可能受到损害的情况。我已经实施了SSL预防措施以及此链接中推荐的其他内容:How can I store sensitive data securely in a MySQL database?。我还查看了此链接中的建议:How do you Encrypt and Decrypt a PHP String?。有没有办法让这些数据被解密以供其他应用程序使用,或者将它当作密码处理它并且只是比较散列值以确保它们相等更安全?
  4. 我的最后一个问题与开销有关。这是一个巨大的数据库,可以测量几千兆字节,包含数百万行和数百列。我只加密此数据库中的几个字段,它们不用作索引。我真的看到这样的影响有多大的性能影响?
  5. 感谢。

1 个答案:

答案 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扩展中可用的加密原语。