配置信息加密
本文档说明如何使用 KeyEncrypt 对
etc/config.properties等配置文件中的敏感值进行加密,并在应用启动时完成解密。
使用场景
当配置文件中包含数据库密码、Ranger 密码、Kafka 密码、ZooKeeper 认证凭据等敏感信息时,可以先使用 KeyEncrypt 生成密文,再将密文写入配置文件。应用启动时通过 KeyEncrypt 读取生效配置中的加密口令和算法,对配置值进行解密。
生成密文
使用 key-encrypt-jasypt-generator.jar 生成密文。该 jar 一般随 AIR 部署包提供,常见路径为 /data/offline_deployment/package:
参数说明:
| 参数 | 说明 |
|---|---|
-a |
加密算法,需与应用启动参数 key.encrypt.jasypt.algorithm 保持一致。 |
-p |
加密密码,需与应用启动参数 key.encrypt.jasypt.password 保持一致。 |
-v |
需要加密的原始明文值。 |
示例:
java -jar key-encrypt-jasypt-generator.jar -a PBEWithMD5AndDES -p 'Aloudata@202501011qaz!QAZ' -v 'VPwSrFw2lVfFokJ'
注意
命令中的密码和明文值建议使用单引号包裹,避免 !、$、& 等特殊字符被 Shell 解释。
生成密文后,需要使用 ENC(...) 包裹密文,并写入原配置项的值位置。例如:
ENC(...) 是 KeyEncrypt 识别密文配置的标记,括号内只填写生成器输出的密文内容,不需要再额外加引号。
应用启动配置
DWS(Spring Boot)
DWS 使用 Spring Environment 读取 key.encrypt.*,支持本地 YAML 和 JVM -D 参数。例如:
key:
encrypt:
type: jasypt
jasypt:
password: ${KEY_ENCRYPT_PASSWORD}
algorithm: PBEWithHmacSHA512AndAES_256
ivGenerator: random
spring:
datasource:
password: ENC(<生成的密文>)
通过本地环境或部署平台的密钥管理能力提供 KEY_ENCRYPT_PASSWORD,并确保算法、口令和 IV 设置与生成密文时一致。现有 YAML 可以继续使用。
Spring Boot 3 需要包含新自动配置注册文件的 key-encrypt-spring:1.0.3。旧版 1.0.2 在 Boot 3 中无法通过默认自动配置入口加载解密器;若暂时无法升级,可将以下参数放在 java 与 -jar 之间:
如已有 spring.main.sources,以逗号追加该类。升级修复包后不再需要此临时参数。启用 Jasypt 后,日志中的 Use jasypt key provider 和 Post-processing Key Encrypt PropertySource instances 可用于检查是否加载;还应验证应用实际读取并使用了解密后的配置值。
查询引擎(Airlift)
查询引擎从其配置文件读取 key.encrypt.*,未配置时回退到 JVM system property。以下示例通过 JVM 参数注入口令与算法;环境变量方式也需要注入相应的 -D 参数。
方式一:通过 -D 参数指定
示例:
-Dkey.encrypt.type=jasypt -Dkey.encrypt.jasypt.password='Aloudata@202501011qaz!QAZ' -Dkey.encrypt.jasypt.algorithm=PBEWithMD5AndDES
方式二:通过临时环境变量指定
查询引擎不直接将 KEY_ENCRYPT_TYPE 等普通环境变量映射为 key.encrypt.*,因此此处需要通过 JAVA_TOOL_OPTIONS 或 JDK_JAVA_OPTIONS 临时注入 -D 参数。例如:
export JAVA_TOOL_OPTIONS="-Dkey.encrypt.type=jasypt -Dkey.encrypt.jasypt.password=Aloudata@202501011qaz!QAZ -Dkey.encrypt.jasypt.algorithm=PBEWithMD5AndDES"
也可以只对单次启动命令生效:
JAVA_TOOL_OPTIONS="-Dkey.encrypt.type=jasypt -Dkey.encrypt.jasypt.password=Aloudata@202501011qaz!QAZ -Dkey.encrypt.jasypt.algorithm=PBEWithMD5AndDES" ./bin/launcher run
JDK 9 及以上也可以使用 JDK_JAVA_OPTIONS:
JDK_JAVA_OPTIONS="-Dkey.encrypt.type=jasypt -Dkey.encrypt.jasypt.password=Aloudata@202501011qaz!QAZ -Dkey.encrypt.jasypt.algorithm=PBEWithMD5AndDES" ./bin/launcher run
如果使用 PBEWithHmacSHA*AndAES_* 等 SHA/AES 类算法,按 KeyEncrypt 约定还需要增加 IV 生成器配置。通过 -D 参数指定时追加:
通过临时环境变量指定时,把该参数一起放入 JAVA_TOOL_OPTIONS 或 JDK_JAVA_OPTIONS:
JAVA_TOOL_OPTIONS="-Dkey.encrypt.type=jasypt -Dkey.encrypt.jasypt.password=<密码> -Dkey.encrypt.jasypt.algorithm=<加密算法> -Dkey.encrypt.jasypt.ivGenerator=random" ./bin/launcher run
一致性要求
加密时使用的 -a、-p 必须与应用启动时生效的 key.encrypt.jasypt.algorithm、key.encrypt.jasypt.password 完全一致,否则应用启动后无法解密配置值。查询引擎使用普通环境变量时,需要显式转换为 JVM -D 参数。
加密算法支持情况
以下算法在当前文档环境的 JDK 上进行过实测:
实测方式为检查 JCE 是否能通过 Cipher 和 SecretKeyFactory 获取对应算法实现。当前 JDK 25 下 17 种算法均由 SunJCE 提供支持。
推荐使用
推荐新配置优先使用 AES 256 位算法。当前 JDK 25 实测支持;如果部署环境是较老的 JDK 8,需要确认是否已启用 unlimited strength crypto policy。
| 序号 | 算法 | 当前 JDK 25 支持情况 | 说明 |
|---|---|---|---|
| 13 | PBEWithHmacSHA1AndAES_256 |
支持 | AES 256 位,SHA1 HMAC。 |
| 14 | PBEWithHmacSHA224AndAES_256 |
支持 | AES 256 位,SHA224 HMAC。 |
| 15 | PBEWithHmacSHA256AndAES_256 |
支持 | AES 256 位,SHA256 HMAC,推荐优先使用。 |
| 16 | PBEWithHmacSHA384AndAES_256 |
支持 | AES 256 位,SHA384 HMAC。 |
| 17 | PBEWithHmacSHA512AndAES_256 |
支持 | AES 256 位,SHA512 HMAC。 |
可选兼容算法
如果运行环境不支持 AES 256 位算法,可以选择 AES 128 位算法。当前 JDK 25 实测支持。
| 序号 | 算法 | 当前 JDK 25 支持情况 | 说明 |
|---|---|---|---|
| 8 | PBEWithHmacSHA1AndAES_128 |
支持 | AES 128 位,SHA1 HMAC。 |
| 9 | PBEWithHmacSHA224AndAES_128 |
支持 | AES 128 位,SHA224 HMAC。 |
| 10 | PBEWithHmacSHA256AndAES_128 |
支持 | AES 128 位,SHA256 HMAC。 |
| 11 | PBEWithHmacSHA384AndAES_128 |
支持 | AES 128 位,SHA384 HMAC。 |
| 12 | PBEWithHmacSHA512AndAES_128 |
支持 | AES 128 位,SHA512 HMAC。 |
旧算法
以下算法 JDK 25 仍支持,但属于 DES、3DES、RC2、RC4 等旧算法体系。仅建议用于兼容历史配置,新配置不建议优先选择。
| 序号 | 算法 | 当前 JDK 25 支持情况 | 说明 |
|---|---|---|---|
| 1 | PBEWithMD5AndDES |
支持 | 旧算法,兼容性较好,安全强度较低。 |
| 2 | PBEWithMD5AndTripleDES |
支持 | 旧算法,基于 3DES。 |
| 3 | PBEWithSHA1AndDESede |
支持 | 旧算法,基于 DESede/3DES。 |
| 4 | PBEWithSHA1AndRC2_40 |
支持 | 旧算法,RC2 40 位。 |
| 5 | PBEWithSHA1AndRC2_128 |
支持 | 旧算法,RC2 128 位。 |
| 6 | PBEWithSHA1AndRC4_40 |
支持 | 旧算法,RC4 40 位。 |
| 7 | PBEWithSHA1AndRC4_128 |
支持 | 旧算法,RC4 128 位。 |
配置流程
- 选择加密算法,建议优先使用
PBEWithHmacSHA256AndAES_256。 - 选择加密密码,并妥善保存;同一套密文需要使用同一个密码解密。
- 使用
key-encrypt-jasypt-generator.jar生成敏感值密文。 - 使用
ENC(密文)格式将生成的密文写入应用配置文件,例如jdbc.password=ENC(<生成的密文>)。 - 按应用类型配置
key.encrypt.type、key.encrypt.jasypt.password、key.encrypt.jasypt.algorithm;DWS 支持 YAML 或 JVM 参数,查询引擎支持其配置文件或 JVM 参数。 - 重启应用,并确认应用可以正常读取加密配置。
注意事项
- 加密密码不要写入普通配置文件,建议通过 JVM 启动参数、环境变量或部署平台的密钥管理能力注入。
- 同一集群内使用同一份加密配置时,各节点的
key.encrypt.jasypt.password和key.encrypt.jasypt.algorithm必须一致。 - 更换加密算法或密码后,需要重新生成所有相关密文,并同步更新应用启动参数。
- 生产环境不要在共享终端或 CI 日志中直接暴露
-p和-v的明文内容。 - 不同 JDK 版本和安全策略可能影响算法可用性,部署前建议在目标运行环境上执行一次加密命令验证算法是否可用。