是“为什么要在 MySQL 中避免使用 AES?” 真的?

信息安全 加密 Web应用程序 数据库 AES mysql
2021-08-10 11:10:02

2012 年 Smashing Magazine 的一篇文章中,我们做出了相当大胆的声明来避免 MySQL 本身中的 AES。或者正如他们所说的“为什么要在 MySQL 中避免使用 AES?”。但是,如果您搜索 SQL 加密,您通常会找到AES_ENCRYPT提到的 from (My)SQL。我并不是说许多搜索结果意味着该陈述是不真实的,但它只是让我思考:下面引用的三个原因真的是真的吗?

对于“为什么 PHP 的 Mcrypt 优于 MySQL 的 AES 功能”的原因,这里的安全专家怎么看:

  • MySQL 需要在应用程序和数据库之间建立数据库链接,以便进行加密和解密。如果数据库发生内部故障,这可能会导致不必要的可伸缩性问题和致命错误,从而使您的应用程序无法使用。

我无法理解这个问题;如果您在 php 中加密/解密,您还需要使用数据库链接将值存储在数据库中吗?如果在 php 端解密失败,这是否也会导致应用程序失败?这里有什么意义?

  • PHP 可以在没有数据库连接的情况下完成相同的 MySQL 解密和加密,这提高了应用程序的速度和效率。

Php 可以“付出一些努力”来提高应用程序的速度吗?因为您在通过线路发送之前进行了加密,所以应用程序(将处理加密)获得了更高的速度和效率?这怎么可能是真的?在我看来,它是关于“最好的工作工具”,所以“php 也有能力”的说法并不意味着它本身也是最好的工具。它只是一个工具,没有争论为什么它是最好的工具。

  • MySQL 经常记录事务,因此如果数据库的服务器受到攻击,那么日志文件会同时生成加密密钥和原始值。

如果您加密数据库中的值并打开日志记录,这是一个有效点。至少你应该关闭通用查询日志,因为二进制日志只记录事务但不记录选择语句。如果您根本不需要日志记录,您只需声明“如果您在 MySQL 中使用 AES,请关闭所有日志记录”。这对我来说听起来比“如果你想在 MySQL 中使用 AES,就在 php 中使用”更有效。

任何人都可以向我解释为什么上述几点可能是有效的,以及为什么 - 一般来说 - 在你的 (php) 应用程序中加密你的数据而不是在 (My)SQL 中加密你的数据更好。

4个回答

在 MySQL 中不使用 AES_* 函数的主要原因是因为它们使用 ECB 块操作模式,这是不安全的。

阅读更多:

https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

编辑:由于 MySQL 5.6.17 发生了变化,MySQL 支持 CBC 块模式,但必须手动启用。阅读http://mysqlserverteam.com/understand-and-satisfy-your-aes-encryption-needs-with-5-6-17/

在所有性能方面,我建议让 MySQL 进行 AES 加密没什么大不了的。与加密数据相比,获取/写入数据可能会浪费(平均)更多时间。除非您的数据库所做的所有事情都是加密和解密。

然而,让 MySQL 执行 AES 存在一个大问题:您需要 PHP 应用程序向 MySQL 发出查询,其中加密密钥作为明文传递。为了保护您必须使用安全连接,否则tcpdump命令很容易窃听您的 PHP-MySQL 讨论。

如果您的 PHP 应用程序在内部对数据进行了加密,那么您的数据暴露量就会减少,处理未加密数据或可查看密钥的组件也会减少。

根据 MySQL 关于加密函数的文档,http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html

警告

除非使用 SSL 连接,否则作为加密函数参数提供的密码或其他敏感值以明文形式发送到 MySQL 服务器。此外,这些值将出现在它们写入的任何 MySQL 日志中。为了避免这些类型的暴露,应用程序可以在将敏感值发送到服务器之前在客户端加密它们。同样的考虑也适用于加密密钥。为了避免暴露这些,应用程序可以使用存储过程在服务器端加密和解密值。

为了避免这些,他们建议在客户端进行加密。

(我不同意这是重复使用数据库函数或代码执行加密吗?虽然有很多重叠)

对于这篇文章,我能想到的唯一理由——这是一个重要且有效的理由——是扩展应用程序层 (PHP) 很容易,但很难扩展关系数据库层 (MySQL)。对于前者,您只需添加更多服务器 - 但后者需要更大的盒子/协调集群。因此,在 PHP 中进行加密可以减少 DBMS 的负载。

此外,关于“MySQL 需要数据库链接......”,将数据发送到其他地方进行处理会引入延迟。计算某些数据的加密或解密值可能是一项艰巨的工作 - 但它不太可能花费几乎与通过网络发送数据一样长的时间。

但最重要的问题是这如何适应安全模型 - 这就是日志和密钥管理问题的来源。