加密命令中input含特殊字符必须加单引号,如input='ora@123$',否则shell会错误解析$等元字符;同时algorithm和password配置须与加密时完全一致,且enc()值需严格格式化。

加密命令里 input 值含特殊字符必须加单引号
Oracle 密码常含 @、$、/ 等 shell 元字符,不加引号会导致命令解析失败。比如密码是 ora@123$,直接写 input=ora@123$ 会让 shell 把 $ 当作变量展开,实际传给 Jasypt 的是空字符串或错误值。
正确做法是:用单引号包裹整个 input 值,例如:input='ora@123$'。双引号在某些 shell 下仍可能触发变量替换,单引号最稳妥。
- 常见踩坑:密码为
sysdba/123,没加引号 → 解析成两个参数,报错Missing required option: input - 验证方式:加引号后执行,检查输出中
----ARGUMENTS-------------------区块里的input:行是否完整显示原始密码
Oracle 连接密码加密必须匹配 algorithm 和 password 配置
Jasypt 解密时严格校验三要素:密文、password(即 salt)、algorithm。Spring Boot 启动时若发现密文无法用配置的 jasypt.encryptor.password 和 jasypt.encryptor.algorithm 解开,会直接抛 IllegalArgumentException: Unable to decrypt 并启动失败。
Oracle 场景下尤其要注意:
- 加密命令用的
algorithm必须和配置文件里jasypt.encryptor.algorithm完全一致(大小写、下划线、空格都敏感),例如命令用PBEWithMD5AndDES,配置就不能写成pbeWithMD5AndDES或PBEWITHMD5ANDDES -
password参数值必须和jasypt.encryptor.password完全相同,包括空格、不可见字符;建议用固定字符串(如ora-enc-key-2026),避免用环境变量或随机生成导致不一致 - Oracle JDBC URL 中的密码字段(如
jdbc:oracle:thin:@//host:1521/orcl)不参与加密,只加密spring.datasource.password的值本身
application.properties 中 ENC() 写法要严格对齐 Spring Boot 版本
Spring Boot 2.4+ 默认禁用 relaxed binding,ENC(...) 必须出现在属性值最开头,且不能有空格。写成 spring.datasource.password = ENC(abc123)(等号后带空格)或 spring.datasource.password=ENC(abc123) # 注释 都会解密失败。
Oracle 项目典型配置示例:
spring.datasource.url=jdbc:oracle:thin:@//192.168.1.100:1521/ORCLPDB1 spring.datasource.username=ENC(i8QgEN4uOy2E1rHzrpSTYA==) spring.datasource.password=ENC(wUF4htaMVai14p6kxPQiQ3BbpSI7GCjt0uA8XeMe7m/HoMnfdhwFOjJSgevpFZnK) jasypt.encryptor.password=ora-enc-key-2026 jasypt.encryptor.algorithm=PBEWithMD5AndDES
注意点:
-
ENC()括号内不能有多余空格,如ENC( abc123 )无效 - Spring Boot 3.x 要求
jasypt-spring-boot-starter版本 ≥ 3.0.5,否则ENC()不被识别 - Oracle 用户名一般不加密(如
SYSTEM、SCOTT),但若需加密,同样套ENC(),且用同一套password和algorithm
测试解密是否生效的最快方法
别等整个应用启动完再查日志——启动卡在 DataSource 初始化阶段,错误信息模糊。直接用 Jasypt CLI 验证密文能否还原:
执行解密命令,确认输出是原始 Oracle 密码:
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input='wUF4htaMVai14p6kxPQiQ3BbpSI7GCjt0uA8XeMe7m/HoMnfdhwFOjJSgevpFZnK' password=ora-enc-key-2026 algorithm=PBEWithMD5AndDES
如果输出不是你的 Oracle 密码,说明要么加密时参数错了,要么配置文件里 jasypt.encryptor.* 写错了。这个步骤比重启应用快 10 倍,且结果明确。
真正容易被忽略的是:Jasypt 加密后的密文每次运行命令都会不同,但只要 input、password、algorithm 不变,解密结果一定唯一。别因为看到两次加密结果不同就怀疑密钥失效。











