Как передать зашифрованный пароль jasypt в базу данных через DataSourceBuilder - PullRequest
0 голосов
/ 03 сентября 2018

Необходимо сохранить зашифрованный пароль в файле .properties, затем расшифровать его в классе конфигурации и передать в базу данных, используя jasypt

Попытка зашифровать и расшифровать пароль с помощью jasypt в приложении springboot
Ссылка ссылка-1 ссылка-2

Добавлена ​​зависимость в POM.XML

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>

Добавлен зашифрованный пароль в .properties файле

mail.encrypted.property=ENC(Fy/hjJHHbIYYwijL5YwXAj8Ho2YTwzhi)

В Springboot Application class

@SpringBootApplication
@EnableEncryptableProperties
@PropertySource(name="EncryptedProperties", value = "classpath:encrypted.properties")
public class MyApplication {
    ...
}

В классе конфигурации

@Value("${mail.encrypted.property}")
private String password;

@ConfigurationProperties(prefix = "mail")
public Datasource ConfigProperties {
    return DataSourceBuilder
        .create()
        .password(password)
        .build();
}

Но при получении ошибки из-за неправильного пароля без добавления кода шифрования приложение работает нормально

1 Ответ

0 голосов
/ 12 декабря 2018

Мне удалось заставить его работать так:

  1. шифратор! Зашифрованные части будут расшифрованы с помощью этого компонента. Он подключен в файл application.properties с заполнителем jasypt.encryptor.bean , здесь вы предоставляете свое волшебное слово (пароль) для дешифрования, чтобы работать

application.properties

jasypt.encryptor.bean=encryptorBean

info.jdbcUrl=jdbc:jtds:sqlserver://xxx.xxx.xxx.xxx:yyy/DEUR
info.username=ENC(1es1kdTptS7HNG5nC8UzT1pmfeYFkww)
info.password=ENC(z6selbQvJrjpxErfsERU6BDtFeweUZX)
info.driverClassName=net.sourceforge.jtds.jdbc.Driver
info.connectionTestQuery=select 1

Тогда как мне получить доступ к зашифрованным свойствам? «Волшебство» совершается в следующем отрывке

Конфигуратор базы данных

package com.telcel.info;

import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.jasypt.encryption.pbe.PBEStringCleanablePasswordEncryptor;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

import javax.sql.DataSource;

@Configuration
@EnableEncryptableProperties
@PropertySource("classpath:application.properties")
public class DatabaseConfig {

    @Autowired
    private Environment env;

    @Bean(name = "encryptorBean")
    public PBEStringCleanablePasswordEncryptor basicTextEncryptor() {
        StandardPBEStringEncryptor encryptor;
        encryptor = new StandardPBEStringEncryptor();
        encryptor.setAlgorithm("PBEWithMD5AndDES");
        encryptor.setPassword("hocus pocus");
        return encryptor;
    }

    @Bean(name = "infoDS")
    @ConfigurationProperties(prefix = "info")
    public DataSource infoDatasource() {
        String username = env.getProperty("info.username");
        String password = env.getProperty("info.password");

        return DataSourceBuilder.create()
                .username(username)
                .password(password)
                .build();
    }

}

За кулисами Среда зарегистрировала classpath.properties также в качестве источника зашифрованного свойства, поэтому, когда вы запрашиваете свойство, если оно окружено ENC (), оно вызывает jasypt.encryptor.bean , чтобы попытаться расшифровать свойство.

Надеюсь, это поможет!

Приветствия

...