spring org.jasypt.exceptions.EncryptionOperationNotPossibleException

zfycwa2u  于 2023-06-04  发布在  Spring
关注(0)|答案(6)|浏览(1265)

我使用的是Jasypt-1.9.0Spring 3.1以及Hibernate 4.0.1。我在我的应用程序中有一个连接到数据库的要求,该数据库的密码(根)以加密的形式存储在应用程序中的属性文件中。
我在网上找了一下,找到了下面的链接:

  1. http://www.jasypt.org/spring31.html
  2. http://www.jasypt.org/hibernate.html
  3. http://www.jasypt.org/encrypting-configuration.html
    我已经完成了以下步骤和配置我的要求:
  • 在build路径中增加了jasypt-1.9.0jasypt-hibernate 4-1.9.0。
  • 在我的dispatcher-servlet文件中添加了以下内容:
< bean id="propertyConfigurer"
   class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">

  < constructor-arg ref="configurationEncryptor" />
  < property name="locations">
    < list>
      < value>classpath:database.properties< /value>
    < /list>
  < /property>
< /bean>

< bean id="configurationEncryptor"
    class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
  < property name="config" ref="environmentVariablesConfiguration" />
< /bean>

< bean id="environmentVariablesConfiguration"
    class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
  < property name="algorithm" value="PBEWithMD5AndDES" />
  < property name="passwordEnvName" value="APP_ENCRYPTION_PASSWORD" />
</bean>
  • 使用Jasypt 1.9.0的**CLI工具,**我生成了下面的密码(附CLI快照)

x1c 0d1x-添加了一个新的环境变量APP_ENCRYPTION_PASSWORD,值为root

  • database.properties文件中增加了加密密码
db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/db1
db.username=root
db.password=ENC(bmfeQmgP/hJrh+mj6NANKA==)

现在,如果我运行我的应用程序,会出现以下异常:

org.jasypt.exceptions.EncryptionOperationNotPossibleException
    at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.decrypt(StandardPBEByteEncryptor.java:981)
    at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.decrypt(StandardPBEStringEncryptor.java:725)
    at org.jasypt.properties.PropertyValueEncryptionUtils.decrypt(PropertyValueEncryptionUtils.java:72)
siv3szwd

siv3szwd1#

这个问题很可能已经过时了,但对于未来的探索者来说... EncryptionOperationNotPossibleException是jasypt抛出的一般异常,用于屏蔽其他可能的异常。在以下情况下可能发生此异常:

  • 你的jdk没有安装JCE unlimited strength(最常见的情况)
  • 你有一些数据在数据库中,是加密之前与其他密码
  • 你在数据库中有一些数据以前没有加密,你给一些字段添加了加密
  • jasypt无法从数据库解密加密值,因为一些奇怪的数据损坏
  • 许多其他人,你只需要调试,找出真实的的原因..
iyr7buue

iyr7buue2#

如果您在加密过程中没有指定所有参数,Jasypt将使用默认值。请确保在解密期间使用这些精确的默认值。否则你可能会有麻烦...
这项工作对我来说:

mvn jasypt:encrypt -Djasypt.encryptor.password='secret' \
    -Djasypt.encryptor.algorithm=PBEWITHHMACSHA512ANDAES_256 \
    -Djasypt.encryptor.iv-generator-classname=org.jasypt.iv.RandomIvGenerator \
    -Djasypt.encryptor.salt-generator-classname=org.jasypt.salt.RandomSaltGenerator \
    -Djasypt.encryptor.key-obtention-iterations=1000  \
    -Djasypt.plugin.path='file:application.yml'
mvn jasypt:decrypt -Djasypt.encryptor.password='secret' \
    -Djasypt.encryptor.algorithm=PBEWITHHMACSHA512ANDAES_256 \
    -Djasypt.encryptor.iv-generator-classname=org.jasypt.iv.RandomIvGenerator \
    -Djasypt.encryptor.salt-generator-classname=org.jasypt.salt.RandomSaltGenerator \
    -Djasypt.encryptor.key-obtention-iterations=1000  \
    -Djasypt.plugin.path='file:application.yml'
roqulrg3

roqulrg33#

我在加密属性文件值时也遇到了类似的问题。我在本地Windows机器上加密了值,并尝试在Linux机器上部署,但JRE版本不同,因此加密的值无法解密。但是我在Linux机器上加密了值,解密成功。

ej83mcc0

ej83mcc04#

我也遇到过类似的问题,但我意识到在使用CLI工具并尝试解密密码时,您不必包含算法属性,并且密码属性需要与CLI工具中使用的属性相匹配。
http://www.jasypt.org/encrypting-configuration.html

他们的例子看起来像这样,但这不起作用。

encryptor.setPassword("jasypt"); // could be got from web, env variable... encryptor.setAlgorithm("PBEWithHMACSHA512AndAES_256"); encryptor.setIvGenerator(new RandomIvGenerator());

解决方案:

encryptor.setPassword("MYPAS_WORD"); // Like in the CLI Tool encryptor.setAlgorithm("PBEWithHMACSHA512AndAES_256"); //Remove this encryptor.setIvGenerator(new RandomIvGenerator()); //Remove this as well
会很好的。
在您的情况下,您可以删除算法属性,并且passwordEvnName需要与CLI工具中使用的属性相匹配。

amrnrhlw

amrnrhlw5#

1.删除所有上述XML配置,并将以下bean添加到配置类:

@Bean public DataSource dataSource() {
DataSourceBuilder dataSourceBuilder = 
DataSourceBuilder.create();
dataSourceBuilder.url(dbUrl);
dataSourceBuilder.username(username);
dataSourceBuilder.password(password);
return dataSourceBuilder.build(); 
}

1.添加属性值,如

@Value("${db.driverclassname}")
private String dbDriverClassName;

@Value("${db.url}")
private String dbUrl;

@Value("${db.username}")
private String dbUsername;

@Value("${db.password}")
private String dbPassword;

并将这些值传递到数据源上方。
1.在属性文件中配置加密密钥,如#

db.driverclassname=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/contactsdb
db.username=contactsuser
db.password=ENC(XcBjfjDDjxeyFBoaEPhG14wEzc6Ja+Xx
+hNPrJyQT888=

1.不要使用cmd和jaspyt jar创建加密密钥我将与您的密钥共享创建加密密钥的链接:
Jasypt Online Encryption and Decryption
1.根据您的版本添加jaspyat依赖项。
如果你必须在服务器上运行,如果你面临密码加密不匹配或不可能的问题,那么再添加一个jdbc模板bean:

@Bean
public JdbcTemplate jdbcTemplate(DataSource 
dataSourcee)
{
    return new JdbcTemplate(dataSource);
}

它工作正常,没有发现任何问题。
使用该工具创建密钥。因为我已经尝试过很多次使用jaspyt命令行,但是加密是错误的,不支持它。您可以交叉检查使用上述工具生成的密钥与密钥。

vc6uscn9

vc6uscn96#

感谢Fado指出了加密工作需要设置的参数。下面的代码现在对我来说是有效的:

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.salt.RandomSaltGenerator;
import org.jasypt.iv.RandomIvGenerator;

public class MyClass {
    public static void main(String args[]) {
      StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
      encryptor.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
      encryptor.setPassword("mypassord");
      
     
        encryptor.setIvGenerator(new RandomIvGenerator());
        encryptor.setSaltGenerator( new RandomSaltGenerator());
        encryptor.setKeyObtentionIterations(1000);
        String encrypted = encryptor.encrypt("encryptThis");

      System.out.println("Encrypted text:" +encrypted);
      System.out.println("Decrypted text:"+encryptor.decrypt(encrypted));
    }
}
´´´´

I've made a JDoodle online project with the example: https://jdoodle.com/ia/IL0

相关问题