Redis(94)如何启用Redis的数据加密?

作者:Victor356日期:2025/10/31

启用Redis的数据加密通常涉及两个主要方面:传输层加密(TLS/SSL)和存储层加密。以下是详细的步骤和代码示例,以帮助您在Redis中实现数据加密。

1. 传输层加密(TLS/SSL)

传输层加密确保在客户端和Redis服务器之间传输的数据是加密的。Redis 6.0及以上版本支持TLS/SSL。

步骤 1: 生成证书和密钥

可以使用OpenSSL生成自签名证书和密钥:

1# 生成CA私钥
2openssl genpkey -out ca.key -algorithm RSA -pkeyopt rsa_keygen_bits:2048
3
4# 生成CA证书
5openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -subj '/CN=MyRedisCA'
6
7# 生成Redis服务器私钥
8openssl genpkey -out redis.key -algorithm RSA -pkeyopt rsa_keygen_bits:2048
9
10# 生成CSR(证书签名请求)
11openssl req -new -key redis.key -out redis.csr -subj '/CN=MyRedisServer'
12
13# 使用CA签署Redis服务器证书
14openssl x509 -req -in redis.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out redis.crt -days 3650 -sha256
15

步骤 2: 配置Redis服务器

修改 redis.conf 文件以启用TLS:

1# redis.conf
2
3# 启用TLS
4tls-port 6379
5port 0
6
7# 证书和密钥文件
8tls-cert-file /path/to/redis.crt
9tls-key-file /path/to/redis.key
10tls-ca-cert-file /path/to/ca.crt
11
12# 可选:要求客户端证书验证
13# tls-auth-clients yes
14

步骤 3: 配置客户端

使用 redis-cli 连接启用了TLS的Redis服务器:

1redis-cli --tls --cert /path/to/redis.crt --key /path/to/redis.key --cacert /path/to/ca.crt -h redis-server-host -p 6379
2

使用 Jedis Java 客户端连接启用了TLS的Redis服务器:

1import redis.clients.jedis.Jedis;
2import redis.clients.jedis.JedisShardInfo;
3
4public class RedisTLSDemo {
5    public static void main(String[] args) {
6        // 配置JedisShardInfo以使用TLS
7        JedisShardInfo shardInfo = new JedisShardInfo("rediss://redis-server-host:6379");
8        shardInfo.setTls(true);
9        shardInfo.setSslSocketFactory(SSLSocketFactory.getDefault());
10        shardInfo.setPassword("yourpassword"); // 如果有密码保护
11
12        try (Jedis jedis = new Jedis(shardInfo)) {
13            // 测试连接
14            String response = jedis.ping();
15            System.out.println(response);  // 应该输出 "PONG"
16        }
17    }
18}
19

2. 应用层加密

应用层加密是在将数据存储到Redis之前,在应用程序中对数据进行加密和解密。

Java示例:加密和解密

1import javax.crypto.Cipher;
2import javax.crypto.KeyGenerator;
3import javax.crypto.SecretKey;
4import javax.crypto.spec.GCMParameterSpec;
5import javax.crypto.spec.SecretKeySpec;
6import java.util.Base64;
7
8public class AESEncryption {
9    private static final String AES = "AES";
10    private static final String AES_GCM_NO_PADDING = "AES/GCM/NoPadding";
11    private static final int GCM_TAG_LENGTH = 16;
12    private static final int GCM_IV_LENGTH = 12;
13    private static final int AES_KEY_SIZE = 256;
14
15    public static SecretKey generateKey() throws Exception {
16        KeyGenerator keyGen = KeyGenerator.getInstance(AES);
17        keyGen.init(AES_KEY_SIZE);
18        return keyGen.generateKey();
19    }
20
21    public static String encrypt(String plainText, SecretKey key, byte[] iv) throws Exception {
22        Cipher cipher = Cipher.getInstance(AES_GCM_NO_PADDING);
23        GCMParameterSpec parameterSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);
24        cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec);
25        byte[] cipherText = cipher.doFinal(plainText.getBytes());
26        return Base64.getEncoder().encodeToString(cipherText);
27    }
28
29    public static String decrypt(String cipherText, SecretKey key, byte[] iv) throws Exception {
30        Cipher cipher = Cipher.getInstance(AES_GCM_NO_PADDING);
31        GCMParameterSpec parameterSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);
32        cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec);
33        byte[] plainText = cipher.doFinal(Base64.getDecoder().decode(cipherText));
34        return new String(plainText);
35    }
36
37    public static void main(String[] args) {
38        try {
39            SecretKey key = generateKey();
40            byte[] iv = new byte[GCM_IV_LENGTH];
41            // 初始化IV(可以使用随机生成的IV)
42
43            String originalData = "Sensitive data";
44
45            // 加密
46            String encryptedData = encrypt(originalData, key, iv);
47            System.out.println("Encrypted Data: " + encryptedData);
48
49            // 解密
50            String decryptedData = decrypt(encryptedData, key, iv);
51            System.out.println("Decrypted Data: " + decryptedData);
52        } catch (Exception e) {
53            e.printStackTrace();
54        }
55    }
56}
57

使用加密数据与Redis交互

1import redis.clients.jedis.Jedis;
2
3public class RedisEncryptedDemo {
4    public static void main(String[] args) {
5        try (Jedis jedis = new Jedis("localhost", 6379)) {
6            // 生成密钥和IV
7            SecretKey key = AESEncryption.generateKey();
8            byte[] iv = new byte[12]; // 示例IV
9
10            // 加密数据
11            String originalData = "Sensitive data";
12            String encryptedData = AESEncryption.encrypt(originalData, key, iv);
13
14            // 存储加密数据到Redis
15            jedis.set("encrypted_key", encryptedData);
16
17            // 从Redis读取加密数据
18            String retrievedEncryptedData = jedis.get("encrypted_key");
19
20            // 解密数据
21            String decryptedData = AESEncryption.decrypt(retrievedEncryptedData, key, iv);
22            System.out.println("Decrypted Data: " + decryptedData);  // 应该输出 "Sensitive data"
23        } catch (Exception e) {
24            e.printStackTrace();
25        }
26    }
27}
28

总结

通过以下步骤可以启用Redis的数据加密:

  1. 传输层加密(TLS/SSL)
    • 生成证书和密钥
    • 配置redis.conf文件
    • 配置客户端
  2. 应用层加密
    • 在客户端应用程序中实现数据的加密和解密
    • 将加密后的数据存储到Redis中,并在读取数据时进行解密

通过结合传输层加密和应用层加密,可以有效地提高Redis中数据的安全性。上述示例代码展示了如何实现这些加密技术,并将其应用于实际的Redis交互中。


Redis(94)如何启用Redis的数据加密?》 是转载文章,点击查看原文


相关推荐


Vue 3 v-for 指南:从基础到精通,彻底掌握列表渲染的艺术
前端摸鱼匠2025/10/28

文章目录 一、初识 v-for:动态世界的基石1.1 遍历数组:最常见的场景1.1.1 基础语法:`item in items`1.1.2 获取索引:`(item, index) in items`1.1.3 嵌套循环:处理二维或多维数据 1.2 遍历对象:探索属性的奥秘1.2.1 基础语法:`(value, key, index) in object`1.2.2 对象遍历的顺序 1.3 遍历数字:生成固定序列 二、核心机制:Key 的深度解析2.1 为什么需要 Key:


Python编程实战 · 基础入门篇 | 元组(tuple)
程序员爱钓鱼2025/10/26

在学习完列表(list)之后,你会发现 Python 中的序列类型非常灵活。但除了可变的列表,还有一种不可变的序列类型——元组(tuple)。 元组在数据处理、函数返回值、解包操作等场景中都非常常见,是 Python 程序员必须掌握的基础结构之一。 一 什么是元组(tuple) 元组(Tuple)是一个有序、不可变的序列类型。 它与列表类似,也可以存放多个不同类型的元素,但一旦创建,内容就不能被修改。 创建元组使用小括号 (),元素之间用逗号分隔: t = (1, 2, 3) print(t


复杂结构数据挖掘(三)关联规则挖掘实验
nju_spy2025/10/23

目录 1. 数据集导入观察 2. Apriori算法、FP-Growth算法 使用方式 3. 朴素 brute-force 4. grid_search 参数比较 + 三种算法比较 5. main 函数 与 报告生成 6. 实验结果总结 – 通过调整不同级别的支持度与置信度,比较 Apriori 算法、FP-Growth 算法以及一种进行穷举搜索的基准方法。 比较维度包括:生成的频繁项集数量、规则挖掘所用的存储空间、计算成本 – 发现一些有趣的关联规则,并就这些规则所揭


MySQL数据库05:DQL查询运算符
Doro再努力2025/10/22

文章目录 一、运算符简介 二、算术运算符 三、比较运算符 四、逻辑运算符 五、条件查询 五、位运算符(了解) 5.1按位与 5.2按位或 5.3按位异或 5.4按位右移 5.5按位左移 5.6按位取反 一、运算符简介         数据库中的表结构确立后,表中的数据代表的意义就已经确定。通过MSQL运算符进行运算,就可以获取到表结构以外的另一种数据。例如,学生表中存在一个birth字段,这个字段表示学生的出生年份,而运用MySQL的算术运算符用当前的年份减学生出


主流的 MCU 开发语言为什么是 C 而不是 C++?
淘晶驰AK2025/10/20

要说主流 MCU 开发为啥是 C 而不是 C++,你先琢磨琢磨 MCU 那点家当 —— 存储空间按 KB 算,RAM 可能就几十 KB,算力更是抠抠搜搜,稍微重点的操作都怕给它干死机。这种环境下,代码的每一个字节、每一次内存访问都得精打细算,而 C 语言天生就带着这种 "极简主义" 的基因。 你想啊,写 MCU 程序,核心就是跟寄存器打交道,直接往地址里塞数,中断服务程序得像闪电一样快,容不得半点拖泥带水。C 语言就像一把朴实的扳手,没有多余的零件,编译器一转就是干干净净的机器码,你写*(vo


jenkins在使用中遇到的问题
tingting01192025/10/19

一、jenkins使用docker命令权限拒绝 将jenkins用户添加到docker组: # usermod -aG docker jenkins # systemctl restart jenkins 二、推送私有仓库提示拒绝 # cp -r /root/.docker ./jenkins # chown -R jenkins.jenkins .docker 三、jenkins 提示kubectl 命令Authentication required # s


美团LongCat-Audio-Codec:给语音大模型装上“顺风耳”与“巧舌”
墨风如雪2025/10/18

各位AI圈的朋友们,又一个重磅消息!美团在2025年10月17日悄然揭开了它在语音AI领域深耕已久的秘密武器——LongCat-Audio-Codec的神秘面纱。这可不是一个普通的编解码器,它旨在为语音大模型(Speech LLM)打造一套全新的“听”与“说”的链路。想象一下,我们离那个能真正流畅、自然、高效对话的AI,又近了一大步! 语音AI的“死结”与LongCat的破解之道 你可能想不到,现在我们与智能设备的那些看似流畅的语音交互背后,其实隐藏着不少“死结”。语音大模型在理解语义、生成逼


AI 在数据库操作中的各类应用场景、方案与实践指南
木易 士心2025/10/16

文章目录 概述1. 数据库探索与结构分析场景说明AI 驱动的数据库探索方案 2. 智能报表生成场景说明AI 自动生成的销售分析报表 3. CRUD 操作优化场景说明AI 优化的智能 CRUD 模板 4. 查询性能优化场景说明AI 驱动的查询优化流程优化前(慢查询)AI 优化建议优化后查询 AI 推荐的索引策略 5. 复杂问题处理方案方案 1:递归查询处理层级数据方案 2:数据质量自动化检查 6. AI 辅助的数据库维护场景说明 7.


C++设计模式之行为型模式:模板方法模式(Template Method)
bkspiderx2025/10/15

模板方法模式(Template Method)是行为型设计模式的一种,它定义了一个算法的骨架,将算法的一些步骤延迟到子类中实现。这种模式允许子类在不改变算法结构的情况下,重新定义算法中的某些步骤,从而实现算法的复用与定制。 一、核心思想与角色 模板方法模式的核心是“固定流程,可变步骤”,通过在父类中定义算法的框架,将可变部分委托给子类实现。其核心角色如下: 角色名称核心职责抽象类(AbstractClass)定义算法的骨架(模板方法),包含多个抽象方法(子类必须实现的步骤)和可选的钩子方法(子


苦练Python第64天:从零掌握多线程,threading模块全面指南
倔强青铜三 VIP.1 初学乍练2025/10/14

前言 大家好,我是倔强青铜三。欢迎关注我,微信公众号:倔强青铜三。点赞、收藏、关注,一键三连! 欢迎继续 苦练Python第64天。 今天咱们把“并发”这把瑞士军刀——threading 模块,从开箱到实战一次性讲透。全程只用 Python 自带标准库,代码复制即可运行! 一、为什么需要线程? I/O 密集场景:爬虫、文件下载、日志采集,CPU 在等网络/磁盘,闲着也是闲着。 共享内存:比多进程轻量,数据不用序列化来回拷贝。 GIL?别慌:I/O 密集时线程照样提速;CPU 密集请转投 mu

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0