redis rdb文件无内置加密机制,所有加密必须由外部工具(如gpg或openssl)在文件写入磁盘后执行;redis 6.2+的aof-encrypt仅适用于aof,对rdb无效;加密后文件无法被redis直接加载,恢复时须先解密生成dump.rdb再启动。

redis-cli --rdb 不支持直接加密,RDB 文件本身没有内置加密机制。所有有效的加密都发生在 Redis 进程外部,且必须在文件写入磁盘后、或写入前由外部工具介入。
RDB 文件加密只能靠外部工具,不是 Redis 自身功能
Redis 6.2+ 虽然支持 aof-encrypt 和 aof-encryption-key,但该功能**仅适用于 AOF 文件**,对 RDB 文件完全无效。官方从未提供 RDB 加密的 native 支持。试图在 redis.conf 里加 rdb-encrypt yes 或类似配置,会导致启动失败或被忽略。
-
SAVE/BGSAVE生成的dump.rdb始终是明文二进制,无密码、无头信息、无校验字段 -
redis-cli --rdb /path只是把当前内存快照 dump 成 RDB 文件,不涉及任何加密逻辑 - 所谓“requirepass 配置后 RDB 自动加密”是常见误解——
requirepass控制的是客户端连接认证,和持久化文件内容无关
推荐方案:用 inotifywait + gpg 实时监听并加密新生成的 dump.rdb
这是生产环境最稳妥的做法,避免定时任务漏触发、也规避了 mv 或 cp 导致的竞态问题。核心是监听 /var/lib/redis/ 目录下 dump.rdb 的写入完成事件。
- 必须用
--batch --yes --passphrase-fd 0,否则gpg会阻塞等待交互输入,导致监控中断 - 密码绝不能出现在命令行(如
-k "xxx"),也不能用echo管道,否则可能泄露到ps aux或 shell history;应从文件重定向: - 加密后原文件要不要删?取决于恢复流程:若保留
dump.rdb,则需确保它不被 Redis 自动加载(比如改名或挪出dir);若删除,则恢复时必须先gpg -d dump.rdb.gpg > dump.rdb,再启动 Redis -
inotifywait进程必须由 systemd 管理,并设置Restart=always,否则 Redis 重启后监控失效
替代方案:用 openssl enc 手动加密已存在的 dump.rdb
适合备份归档或离线场景,不适合自动流水线。注意 OpenSSL 版本差异会影响兼容性:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- OpenSSL 1.1.1+ 默认使用 AEAD 模式(如
-aes-256-gcm),但老版本或某些脚本依赖 CBC 模式,需显式指定-aes-256-cbc - 务必加
-salt,否则相同密码+明文永远产出相同密文,易受 rainbow table 攻击 - 解密命令必须与加密参数严格一致,尤其是
-md sha256—— OpenSSL 3.0 默认用sha256,但 1.0.x 默认是md5,混用会导致bad decrypt - 示例加密:
openssl enc -aes-256-cbc -salt -in dump.rdb -out dump.rdb.enc -k "$(cat /etc/redis/pass.txt)" -md sha256
加密后的 RDB 文件无法被 Redis 直接加载
这是最容易被忽略的关键点:无论你用 gpg 还是 openssl 加密,得到的 dump.rdb.gpg 或 dump.rdb.enc 都只是普通加密文件,Redis 启动时读取 dir 下的 dump.rdb 时,会直接报错退出(错误信息类似 Failed reading the RDB file: Invalid argument 或更模糊的 Cannot open RDB file)。
恢复流程必须是两步:先解密生成合法的 dump.rdb,再启动 Redis。没有捷径,也没有插件能绕过这个限制。










