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 lanjutanJika 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"); } }
BeanFactoryPostProcessor
1 Keluarkan semua
dan lalui mereka dalam urutan
2. Tapis ConfigurableEnvironment
yang tidak memenuhi keperluan kami kerana PropertySource
Terdapat banyak subkelas, dan tidak semua contoh
PropertySource
3 PropertySource
yang memenuhi keperluan, yang sebenarnya merupakan proksi statik; PropertySource
mengambil nilai Contohnya, menyahsulit kata laluan sifir PropertySource
PropertySource
Fahami 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
untuk mencari pakej yang berkaitan: PropertySource
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.5</version> </dependency>
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: ""
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 ConfigurableEnvironment
PropertySource
melaksanakan 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 sifirOperasi 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); } }
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!