0%

配置属性加密解密

Spring Cloud Config 加密解密:保护敏感配置信息

在分布式系统中,数据库密码、API 密钥等敏感配置需要加密存储,避免明文泄露。Spring Cloud Config 提供了完善的加密解密机制,支持对称加密和非对称加密两种方式,确保敏感信息在传输和存储过程中的安全性。

加密解密的前提准备

Spring Cloud Config 的加密功能依赖 Java 加密扩展(JCE),需先确保环境配置正确:

  1. 下载 JCE
    对于 JDK 8 及以下版本,需手动下载 Java Cryptography Extension (JCE) Unlimited Files

    JDK 9+ 已内置无限制强度的 JCE,无需额外配置。

  2. 安装 JCE
    将下载的 JCE 包中的 local_policy.jarUS_export_policy.jar 复制到 $JAVA_HOME/jre/lib/security/ 目录,覆盖原有文件。

对称加密(Symmetric Encryption)

对称加密使用相同的密钥进行加密和解密,配置简单,适合中小规模系统。

1. 配置加密密钥

在配置中心(Config Server)的 bootstrap.yml 中指定加密密钥:

1
2
encrypt:
key: my-secret-key # 对称加密密钥(生产环境需复杂且保密)

2. 使用加密端点

配置中心启动后,会自动暴露 /encrypt/decrypt 端点,用于加密和解密:

(1)加密敏感信息

通过 POST 请求加密明文(如数据库密码):

1
2
# 加密明文"db-pass-123"
curl -X POST http://localhost:7010/encrypt -d "db-pass-123"

返回密文(示例):

1
851a6effab6619f43135a714061f4602be0251b73b56b0451a7e268c880daea3
(2)解密密文

通过 POST 请求解密密文:

1
2
# 解密密文(使用上述返回的密文)
curl -X POST http://localhost:7010/decrypt -d "851a6effab6619f43135a714061f4602be0251b73b56b0451a7e268c880daea3"

返回明文:

1
db-pass-123

3. 在配置文件中使用加密值

将加密后的密文用 {cipher} 前缀包裹,写入 Git 仓库的配置文件(如 application.yml):

1
2
3
4
5
spring:
datasource:
username: root
# 使用加密后的密码(密文需用单引号包裹)
password: '{cipher}851a6effab6619f43135a714061f4602be0251b73b56b0451a7e268c880daea3'

注意:密文必须用单引号 ' 包裹,否则 YAML 解析器可能报错。

非对称加密(Asymmetric Encryption)

非对称加密使用公钥加密、私钥解密,安全性更高,适合大规模分布式系统。需通过 keytool 生成密钥库(KeyStore)。

1. 生成密钥库(JKS)

使用 JDK 自带的 keytool 工具生成 RSA 密钥对:

1
2
3
4
5
6
7
8
9
# 生成密钥库(JKS格式)
keytool -genkeypair \
-alias mytestkey \ # 密钥别名
-keyalg RSA \ # 密钥算法(RSA)
-keystore server.jks \ # 密钥库文件名
-keypass keypass \ # 密钥口令(保护私钥)
-storepass storepass \ # 密钥库口令(保护整个密钥库)
-keysize 2048 \ # 密钥长度(2048位)
-validity 3650 # 有效期(10年)

执行后会生成 server.jks 文件,将其复制到配置中心的 src/main/resources 目录(类路径下)。

2. 配置非对称加密

在配置中心的 bootstrap.yml 中配置密钥库信息:

1
2
3
4
5
6
encrypt:
key-store:
location: classpath:server.jks # 密钥库路径(类路径下)
alias: mytestkey # 密钥别名(与生成时一致)
password: storepass # 密钥库口令
secret: keypass # 密钥口令(私钥保护密码)

3. 使用非对称加密

(1)获取公钥(可选)

如需在客户端手动加密,可通过配置中心获取公钥:

1
curl http://localhost:7010/encrypt/public

返回公钥(示例):

1
2
3
4
{
"alg": "RSA",
"value": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+..."
}
(2)加密和解密

非对称加密的端点使用方式与对称加密一致:

  • 加密:curl -X POST http://localhost:7010/encrypt -d "敏感信息"
  • 解密:curl -X POST http://localhost:7010/decrypt -d "密文"

配置文件中使用密文的方式也相同(需加 {cipher} 前缀)。

客户端解密机制

客户端(微服务)无需配置加密密钥,只需确保能访问配置中心:

  1. 客户端启动时从配置中心拉取加密的配置;
  2. 配置中心自动解密后返回明文给客户端;
  3. 客户端直接使用解密后的配置(无需额外处理)。

注意:客户端不会获取到加密密钥,解密过程由配置中心完成,确保密钥安全。

生产环境注意事项

  1. 密钥管理

    • 对称加密的密钥(encrypt.key)需严格保密,避免硬编码在配置文件中,可通过环境变量或密钥管理服务(如 Vault)注入。
    • 非对称加密的密钥库(server.jks)需设置复杂口令,并限制文件访问权限。
  2. 端点安全

    • 生产环境需为 /encrypt/decrypt 端点添加认证(如结合 Spring Security),避免未授权访问。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 仅允许管理员角色访问加密端点
    management:
    endpoints:
    web:
    exposure:
    include: encrypt,decrypt
    endpoint:
    encrypt:
    roles: ADMIN
    decrypt:
    roles: ADMIN
  3. 性能考量

    • 非对称加密的性能低于对称加密,建议仅对核心敏感信息(如数据库密码)使用非对称加密,其他信息可使用对称加密。
  4. 密钥轮换

    • 定期轮换密钥(尤其是对称加密密钥),避免长期使用同一密钥导致泄露风险。

总结

Spring Cloud Config 提供的加密解密功能有效保护了敏感配置信息,对称加密适合简单场景,非对称加密适合高安全性需求。实际应用中需结合密钥管理、端点安全和定期轮换策略,构建完整的敏感信息保护体系

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10