Spring非Boot项目在applicationContext.xml用Jasypt加密密码遇ORA-01017错误求助
嘿,你的这个ORA-01017错误很明确——Spring根本没把你那串ENC(...)的密文解密成真实密码,直接把密文传给Oracle了,那肯定登不上啊。非Spring Boot的项目没法像Spring Boot那样靠自动配置一键搞定Jasypt,你大概率是漏了几个核心配置步骤,我帮你逐个理清楚:
1. 必须手动配置Jasypt加密器Bean
你只加了Jar包和修改了密码格式,但Spring完全不知道该用什么算法、密钥来解密ENC()里的内容。得在applicationContext.xml里添加加密器的配置,比如用Jasypt常用的PBEWithMD5AndDES算法:<bean id="jasyptStringEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor"> <property name="algorithm" value="PBEWithMD5AndDES"/> <property name="password" value="你的加密密钥"/> <!-- 这个密钥必须和你加密原始密码时用的完全一致 --> </bean>划重点:这里的
password是你用来加密原始数据库密码的密钥,不是数据库本身的密码,千万别搞混!2. 替换Spring默认的属性占位符处理器
原生的PropertyPlaceholderConfigurer根本不认识ENC()这种格式,你得换成Jasypt提供的EncryptablePropertyPlaceholderConfigurer,它才会自动识别并解密密文:<bean class="org.jasypt.spring.properties.EncryptablePropertyPlaceholderConfigurer"> <constructor-arg ref="jasyptStringEncryptor"/> <!-- 如果你的配置分散在多个properties文件,这里用locations指定路径 --> <property name="locations"> <list> <value>classpath:db.properties</value> </list> </property> </bean>要是你直接在
applicationContext.xml里硬编码了数据库连接配置(没引用外部properties),也要确保这个加密器被关联到数据源的配置逻辑中,否则密文还是不会被解密。3. 验证加密密文的生成是否正确
你得确认那串ENC(...)是用Jasypt官方工具生成的,不是自己随便写的。可以用命令行工具快速生成:java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="你的原始数据库密码" password="你的加密密钥" algorithm=PBEWithMD5AndDES命令执行后输出的
ENC(...)字符串才是你该放到配置里的内容,仔细检查有没有复制错符号或者漏字符。4. 确保Jasypt依赖完整
你说加了Jasypt 1.9.2的Jar包,要确认是完整的jasypt-1.9.2.jar,不是某个精简版。如果用Maven管理依赖,直接加下面的配置更稳妥:<dependency> <groupId>org.jasypt</groupId> <artifactId>jasypt</artifactId> <version>1.9.2</version> </dependency>
如果做完这些还是有问题,建议开启Jasypt的调试日志,看看解密过程有没有抛出异常,比如密钥不匹配、算法不一致之类的,这些日志能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者JavaSheriff

