### 17.3.2加密二进制日志文件和中继日志文件

[17.3.2.1二进制日志加密的范围](replication-binlog-encryption-scope.html)
[17.3.2.2二进制日志加密密钥](replication-binlog-encryption-encryption-keys.html)
[17.3.2.3二进制日志主密钥旋转](replication-binlog-encryption-key-rotation.html)

[](<>)[](<>)

从MySQL 8.0.14开始，二进制日志文件和中继日志文件可以被加密，有助于保护这些文件及其包含的潜在敏感数据不被外部攻击者滥用，也不被存储它们的操作系统的用户未经授权地查看。用于文件的加密算法AES（高级加密标准）密码算法内置于MySQL服务器，无法配置。

通过设置[`binlog_加密`](replication-options-binary-log.html#sysvar_binlog_encryption)系统变量到`在…上`.`关`这是默认值。系统变量为二进制日志文件和中继日志文件设置加密。不需要在服务器上启用二进制日志来启用加密，因此可以在没有二进制日志的复制副本上加密中继日志文件。要使用加密，必须安装并配置密钥环组件或插件，以提供MySQL服务器的密钥环服务。有关执行此操作的说明，请参阅[第6.4.4节，“MySQL密钥环”](keyring.html).任何受支持的密钥环组件或插件都可用于存储二进制日志加密密钥。

首次在启用加密的情况下启动服务器时，在初始化二进制日志和中继日志之前，会生成一个新的二进制日志加密密钥。此密钥用于加密每个二进制日志文件（如果服务器启用了二进制日志记录）和中继日志文件（如果服务器具有复制通道）的文件密码，并且从文件密码生成的其他密钥用于加密文件中的数据。服务器上当前使用的二进制日志加密密钥称为二进制日志主密钥。两层加密密钥体系结构意味着二进制日志主密钥可以根据需要进行旋转（替换为新的主密钥），并且只需要使用新的主密钥对每个文件的文件密码进行重新加密，而不需要对整个文件进行重新加密。中继日志文件对所有通道进行加密，包括加密激活后创建的新通道。二进制日志索引文件和中继日志索引文件从不加密。

如果在服务器运行时激活加密，则会在此时生成新的二进制日志加密密钥。例外情况是，如果加密之前在服务器上处于活动状态，然后被禁用，在这种情况下，以前使用的二进制日志加密密钥将再次使用。立即旋转二进制日志文件和中继日志文件，并使用此二进制日志加密密钥加密新文件和所有后续二进制日志文件和中继日志文件的文件密码。服务器上仍然存在的现有二进制日志文件和中继日志文件未加密，但如果不再需要，可以清除它们。

如果通过更改[`binlog_加密`](replication-options-binary-log.html#sysvar_binlog_encryption)系统变量到`关`，二进制日志文件和中继日志文件立即旋转，所有后续日志记录均未加密。以前加密的文件不会自动解密，但服务器仍然能够读取它们。这个[`BINLOG_加密_管理`](privileges-provided.html#priv_binlog-encryption-admin)在服务器运行时激活或停用加密需要特权。

加密和未加密的二进制日志文件可以使用加密日志文件的文件头开头的幻数进行区分(`0xFD62696E`)，这与未加密的日志文件不同(`0xFE62696E`).这个[`显示二进制日志`](show-binary-logs.html)语句显示每个二进制日志文件是加密的还是未加密的。

二进制日志文件加密后，[**mysqlbinlog**](mysqlbinlog.html)无法直接读取，但可以使用[`--从远程服务器读取`](mysqlbinlog.html#option_mysqlbinlog_read-from-remote-server)选项从MySQL 8.0.14开始，[**mysqlbinlog**](mysqlbinlog.html)如果您试图直接读取加密的二进制日志文件，但在旧版本的[**mysqlbinlog**](mysqlbinlog.html)根本不将该文件识别为二进制日志文件。如果您使用[**mysqlbinlog**](mysqlbinlog.html)，请注意，使用[**mysqlbinlog**](mysqlbinlog.html)以未加密的格式存储。

二进制日志加密可以与二进制日志事务压缩相结合（从MySQL 8.0.20开始提供）。有关二进制日志事务压缩的更多信息，请参阅[第5.4.4.5节，“二进制日志事务压缩”](binary-log-transaction-compression.html).
