14

我将Jasypt-1.9.0Spring 3.1Hibernate 4.0.1一起使用。我的应用程序需要连接到数据库,其密码(root)以加密形式存储在应用程序的属性文件中。

我在网上查看并通过以下链接找到了方法:

  1. http://www.jasypt.org/spring31.html

  2. http://www.jasypt.org/hibernate.html

  3. http://www.jasypt.org/encrypting-configuration.html

我已经根据我的要求完成了以下步骤和配置:

  • 在构建路径中添加了 jasypt-1.9.0jasypt-hibernate4 -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 快照)

在此处输入图像描述 - 添加了一个新的环境变量作为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)
4

5 回答 5

20

这个问题很可能已经过时了,但对于未来的寻求者...... EncryptionOperationNotPossibleException 是 jasypt 抛出的一般异常,以掩盖其他可能的异常。在以下情况下可能会发生此异常:

  • 您的 jdk 没有安装 JCE 无限强度(最常见的情况)
  • 你在数据库中有一些数据之前用其他密码加密过
  • 您在数据库中有一些之前未加密的数据,并且您在某些字段中添加了加密
  • 由于一些奇怪的数据损坏,jasypt 未能从 db 解密加密值
  • 许多其他人,您只需要调试即可找出真正的原因..
于 2014-07-29T07:57:10.543 回答
3

如果您在加密期间未指定所有参数,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' 
于 2020-03-03T13:55:07.323 回答
1

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

于 2017-10-23T07:08:56.147 回答
0
  1. 删除以上所有 XML 配置并将以下 bean 添加到您的配置类中:

    @Bean public DataSource dataSource() {
    DataSourceBuilder dataSourceBuilder = 
    DataSourceBuilder.create();
    dataSourceBuilder.url(dbUrl);
    dataSourceBuilder.username(username);
    dataSourceBuilder.password(password);
    return dataSourceBuilder.build(); 
    }
    
  2. 从属性中添加值,例如

    @Value("${db.driverclassname}")
    private String dbDriverClassName;
    
    @Value("${db.url}")
    private String dbUrl;
    
    @Value("${db.username}")
    private String dbUsername;
    
    @Value("${db.password}")
    private String dbPassword;
    

    并将这些值传递到数据源之上。

  3. 在属性文件中配置您的加密密钥,例如#

    db.driverclassname=com.mysql.jdbc.Driver
    db.url=jdbc:mysql://localhost:3306/contactsdb
    db.username=contactsuser
    db.password=ENC(XcBjfjDDjxeyFBoaEPhG14wEzc6Ja+Xx
    +hNPrJyQT888=
    
  4. 不要使用 cmd 和 jaspyt jar 创建您的加密密钥,我将分享使用您的密钥创建加密密钥的链接:

    Jasypt 在线加解密

  1. 根据您的版本添加 jaspyat 依赖项。

    如果您必须在服务器上运行并且遇到密码加密不匹配或不可能等问题,请再添加一个 bean 的 jdbc 模板:

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

它工作正常,没有发现任何问题。

使用该工具创建密钥。因为我用jaspyt命令行尝试过很多次,但是加密是错误的,不支持。您可以将使用上述工具生成的密钥与密钥进行交叉检查。

于 2021-01-19T15:49:59.137 回答
0

我遇到了类似的问题,但我意识到在使用 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

它会正常工作的。

在您的情况下,您可以删除 algorithm 属性,并且 passwordEvnName 需要与 CLI 工具中使用的相匹配。

于 2020-02-17T08:50:56.367 回答