Rumah  >  Artikel  >  Java  >  Bagaimana Springboot melaksanakan penyulitan kata laluan teks biasa dalam fail konfigurasi

Bagaimana Springboot melaksanakan penyulitan kata laluan teks biasa dalam fail konfigurasi

WBOY
WBOYke hadapan
2023-05-10 22:25:111413semak imbas

Contoh paparan

Mari kita lihat konfigurasi ini:

spring:
  # 数据库链接配置
  datasource:
    url: jdbc:mysql://xx.xx.xx.xx:3306/database
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: "123456"

Nilai yang sepadan bagi konfigurasi kami di atas spring.datasource.password ialah 123456 Maklumat sensitif tersebut diletakkan terus dalam konfigurasi fail Ia sangat tidak sesuai. Apa yang perlu kita lakukan ialah menukar nilai yang sepadan kepada teks sifir yang disulitkan, seperti berikut:

spring:
  # 数据库链接配置
  datasource:
    url: jdbc:mysql://xx.xx.xx.xx:3306/database
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: "AES(DzANBAhBWXxZqAOsagIBCoaw8FV4gYRbid7G70UEM24=)"

Dalam kes ini, walaupun fail konfigurasi diambil oleh seseorang yang mempunyai niat, pangkalan data sebenar kata laluan tidak akan diketahui. Apa itu, ia tidak boleh menimbulkan risiko pelanggaran kepada projek itu; daripada

dan pengetahuan penyulitan dan penyahsulitan data yang sepadan Mari kita lihat titik lanjutan

mana yang patut kita potong

Jika kita ingin memintas data konfigurasi, kita boleh mengendalikannya melaksanakan Spring tersuai: Spring

public class PropertySourcePostProcessor implements BeanFactoryPostProcessor {

  private ConfigurableEnvironment environment;

  public PropertySourcePostProcessor(ConfigurableEnvironment environment) {
    this.environment = environment;
  }

  @Override
  public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    // 从ConfigurableEnvironment中取出所有的配置数据
    MutablePropertySources propertySources = this.environment.getPropertySources();
    propertySources.stream()
        // 过滤不需要包装的对象
        .filter(s -> !noWrapPropertySource(s))
        // 包装所有的PropertySource
        .map(s -> new EncryPropertySource(s))
        .collect(Collectors.toList())
        // 替换掉propertySources中的PropertySource
        .forEach(wrap -> propertySources.replace(wrap.getName(), wrap));
  }

  private boolean noWrapPropertySource(PropertySource propertySource) {
    return propertySource instanceof EncryPropertySource || StringUtils.equalsAny(propertySource.getClass().getName(), "org.springframework.core.env.PropertySource$StubPropertySource", "org.springframework.boot.context.properties.source.ConfigurationPropertySourcesPropertySource");
  }
}

Prinsip asas dianalisis seperti berikut:

BeanFactoryPostProcessor1 Keluarkan semua

melalui

dan lalui mereka dalam urutan

2. Tapis ConfigurableEnvironment yang tidak memenuhi keperluan kami kerana PropertySourceTerdapat banyak subkelas, dan tidak semua contoh

memenuhi keperluan pembungkusan kami

PropertySource3 PropertySource yang memenuhi keperluan, yang sebenarnya merupakan proksi statik; PropertySource

4. kita boleh melakukan beberapa operasi tersuai apabila

mengambil nilai Contohnya, menyahsulit kata laluan sifir PropertySource

Masalah yang selebihnya ialah penyulitan dan penyahsulitan kaedah ialah penyulitan simetri. Penyulitan dan penyahsulitan memerlukan kunci yang sama, manakala penyulitan asimetrik memerlukan kunci awam untuk penyulitan dan kunci peribadi untuk penyahsulitan

PropertySourceFahami perbezaan antara penyulitan simetri dan penyulitan simetri Penyulitan, kemudian pastikan untuk mengelak daripada meletakkan teks sifir dan kunci di tempat yang sama; >Seterusnya Kami ingin memperkenalkan alat PropertySource khusus untuk keperluan ini, iaitu

, kita boleh pergi ke gudang

untuk mencari pakej yang berkaitan: PropertySource

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

Prinsip pelaksanaannya sebenarnya adalah apa kami menerangkan di atas Ya, dengan menyesuaikan

untuk memintas dan membalut tika

dalam

, dan melaksanakan lapisan operasi penyahsulitan pada pelaksanaan kelas pembungkusan, dengan itu merealisasikan penyahsulitan kata laluan sifir; >非对称加密Selepas mengimport kebergantungan di atas, alat akan berkuat kuasa secara automatik dan kami boleh mengubah suai konfigurasi yang sepadan Pertama, kami akan membuat beberapa konfigurasi untuk alat:

jasypt:
  encryptor:
    # 密钥
    password: ""
    property:
      # 密文前缀
      prefix: ""
      # 密文后缀
      suffix: ""

Dalam konfigurasi di atas, mesti Apa yang perlu dikonfigurasikan ialah kunci penyulitan dan penyahsulitan Algoritma penyulitan lalai ialah

sebagai tambahan,

dan jar masing-masing ialah awalan teks sifir dan akhiran teks sifir, yang digunakan untuk menandakan teks sifir. yang perlu dinyahsulit. Jika tidak dikonfigurasikan, awalan teks sifir lalai ialah jasypt dan akhiran teks sifir ialah maven secara lalai, teks sifir kami adalah seperti berikut:

spring:
  datasource:
    password: "ENC(DzANBAhBWXxZqAOsagIBCoaw8FV4gYRbid7G70UEM24=)"

Titik lain yang memerlukan perhatian ialah BeanFactoryPostProcessor tidak boleh diletakkan bersama-sama dengan teks sifir, kita boleh menghantarnya melalui sifat sistem, parameter baris arahan atau pembolehubah persekitaran dalam projek ConfigurableEnvironmentPropertySourcemelaksanakan penyulitan dan penyahsulitan tersuai

jika menyediakan Kaedah penyulitan dan penyahsulitan tidak dapat memenuhi keperluan projek kami Kami juga boleh melaksanakan penyulitan dan penyahsulitan sendiri:

@Bean("jasyptStringEncryptor")
  public StringEncryptor jasyptStringEncryptor(){
    return new StringEncryptor() {
      @Override
      public String encrypt(String s) {
        // TODO 加密
        return null;
      }

      @Override
      public String decrypt(String s) {
        // TODO 解密
        return null;
      }
    };
  }

Beri perhatian kepada jasypt.encryptor.password kami secara lalai, jika tidak ia tidak akan berkuat kuasa. Jika anda mahu Untuk menukar ini PBEWITHHMACSHA512ANDAES_256, anda juga boleh menyesuaikan jasypt.encryptor.property.prefix yang sepadan dengan contoh jasypt.encryptor.property.suffix dengan mengubah suai parameter konfigurasi ini: ENC(

jasypt:
  encryptor:
    # 自定义StringEncryptor的BeanName
    bean: ""
)Cara menjana teks sifir

Operasi untuk menjana teks sifir ini Anda masih perlu menyulitkan dan menjananya sendiri dengan memanggil contoh jasypt.encryptor.password Anda boleh merujuk kepada kod berikut:

@Component
public class StringEncryptorUtil{
  @Autowired
  private StringEncryptor encryptor;
  
  public void encrypt(){
    String result = encryptor.encrypt("123456");
    System.out.println(result);
  }
}

Lagipun, operasi yang memerlukan penyulitan sahaja. perlu dilakukan sekali dalam kitaran hayat projek, jadi kita hanya perlu menulis alat Hanya panggil kelas.

Atas ialah kandungan terperinci Bagaimana Springboot melaksanakan penyulitan kata laluan teks biasa dalam fail konfigurasi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam