Integrasi Jasypt untuk Spring boot 2.x dan 3.0.0
Jasypt Spring Boot menyediakan dukungan Enkripsi untuk sumber properti di Aplikasi Spring Boot.
Ada 3 cara untuk mengintegrasikan jasypt-spring-boot
di proyek Anda:
jasypt-spring-boot-starter
ke classpath Anda jika menggunakan @SpringBootApplication
atau @EnableAutoConfiguration
akan mengaktifkan properti yang dapat dienkripsi di seluruh Lingkungan Springjasypt-spring-boot
ke classpath Anda dan menambahkan @EnableEncryptableProperties
ke kelas Konfigurasi utama Anda untuk mengaktifkan properti yang dapat dienkripsi di seluruh Lingkungan Springjasypt-spring-boot
ke classpath Anda dan mendeklarasikan sumber properti individual yang dapat dienkripsi dengan @EncrytablePropertySource
Gunakan salah satu dari 3 metode berikut (dijelaskan secara singkat di atas):
Cukup tambahkan ketergantungan jar starter ke proyek Anda jika aplikasi Spring Boot Anda menggunakan @SpringBootApplication
atau @EnableAutoConfiguration
dan properti yang dapat dienkripsi akan diaktifkan di seluruh Lingkungan Spring (Ini berarti semua properti sistem, properti lingkungan, argumen baris perintah, properti aplikasi, aplikasi -*.properties, properti yaml, dan sumber properti lainnya dapat berisi properti terenkripsi):
< dependency >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-spring-boot-starter</ artifactId >
< version >3.0.5</ version >
</ dependency >
JIKA Anda tidak menggunakan anotasi @SpringBootApplication
atau @EnableAutoConfiguration
Auto Configuration, tambahkan ketergantungan ini ke proyek Anda:
< dependency >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-spring-boot</ artifactId >
< version >3.0.5</ version >
</ dependency >
Dan kemudian tambahkan @EnableEncryptableProperties
ke kelas Konfigurasi Anda. Misalnya:
@ Configuration
@ EnableEncryptableProperties
public class MyApplication {
...
}
Dan properti yang dapat dienkripsi akan diaktifkan di seluruh Lingkungan Spring (Ini berarti properti sistem, properti lingkungan, argumen baris perintah, properti aplikasi, properti yaml, dan sumber properti khusus lainnya dapat berisi properti terenkripsi)
JIKA Anda tidak menggunakan anotasi @SpringBootApplication
atau @EnableAutoConfiguration
Konfigurasi Otomatis dan Anda tidak ingin mengaktifkan properti yang dapat dienkripsi di seluruh Lingkungan Spring, ada opsi ketiga. Pertama tambahkan ketergantungan berikut ke proyek Anda:
< dependency >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-spring-boot</ artifactId >
< version >3.0.5</ version >
</ dependency >
Lalu tambahkan anotasi @EncryptablePropertySource
sebanyak yang Anda inginkan di file Konfigurasi Anda. Sama seperti yang Anda lakukan dengan anotasi @PropertySource
Spring. Misalnya:
@ Configuration
@ EncryptablePropertySource ( name = "EncryptedProperties" , value = "classpath:encrypted.properties" )
public class MyApplication {
...
}
Mudahnya, ada juga anotasi @EncryptablePropertySources
yang dapat digunakan untuk mengelompokkan anotasi bertipe @EncryptablePropertySource
seperti ini:
@ Configuration
@ EncryptablePropertySources ({ @ EncryptablePropertySource ( "classpath:encrypted.properties" ),
@ EncryptablePropertySource ( "classpath:encrypted2.properties" )})
public class MyApplication {
...
}
Perhatikan juga bahwa mulai versi 1.8, @EncryptablePropertySource
mendukung file YAML
Pada versi 1.7 1.15, metode ke-4 untuk mengaktifkan properti yang dapat dienkripsi ada untuk beberapa kasus khusus. Kelas ConfigurableEnvironment
khusus disediakan: EncryptableEnvironment
StandardEncryptableEnvironment
dan StandardEncryptableServletEnvironment
yang dapat digunakan dengan SpringApplicationBuilder
untuk mendefinisikan lingkungan kustom dengan cara ini:
new SpringApplicationBuilder ()
. environment ( new StandardEncryptableEnvironment ())
. sources ( YourApplicationClass . class ). run ( args );
Metode ini hanya memerlukan penggunaan ketergantungan untuk jasypt-spring-boot
. Tidak diperlukan ketergantungan pada tabung starter. Metode ini berguna untuk akses awal properti terenkripsi pada bootstrap. Meskipun tidak diperlukan di sebagian besar skenario, ini dapat berguna saat menyesuaikan perilaku init Spring Boot atau mengintegrasikan dengan kemampuan tertentu yang dikonfigurasi sejak awal, seperti konfigurasi Logging. Sebagai contoh nyata, metode mengaktifkan properti yang dapat dienkripsi ini adalah satu-satunya yang berfungsi dengan penggantian Spring Properties di file logback-spring.xml
, menggunakan tag springProperty
. Misalnya:
< springProperty name = " user " source = " db.user " />
< springProperty name = " password " source = " db.password " />
< appender name = " db " class = " ch.qos.logback.classic.db.DBAppender " >
< connectionSource
class = " ch.qos.logback.core.db.DriverManagerConnectionSource " >
< driverClass >org.postgresql.Driver</ driverClass >
< url >jdbc:postgresql://localhost:5432/simple</ url >
< user >${user}</ user >
< password >${password}</ password >
</ connectionSource >
</ appender >
Mekanisme ini dapat digunakan misalnya (seperti yang ditunjukkan) untuk menginisialisasi Database Logging Appender yang memerlukan kredensial sensitif untuk diteruskan. Alternatifnya, jika StringEncryptor
khusus perlu disediakan, metode pembuat statis disediakan StandardEncryptableEnvironment#builder
untuk penyesuaian (penyesuaian lain dimungkinkan):
StandardEncryptableEnvironment
. builder ()
. encryptor ( new MyEncryptor ())
. build ()
Ini akan memicu beberapa konfigurasi dimuat yang pada dasarnya melakukan 2 hal:
StringEncryptor
default yang dapat dikonfigurasi melalui properti reguler, properti sistem, atau argumen baris perintah. Saat menggunakan METODE 1 dan 2 Anda dapat menentukan properti terenkripsi di PropertySource mana pun yang terdapat di Lingkungan. Misalnya, menggunakan anotasi @PropertySource:
@ SpringBootApplication
@ EnableEncryptableProperties
@ PropertySource ( name = "EncryptedProperties" , value = "classpath:encrypted.properties" )
public class MyApplication {
...
}
Dan file properti terenkripsi Anda akan terlihat seperti ini:
secret.property =ENC(nrmZtkF7T0kjG/VodDvBw93Ct8EgjCA+)
Sekarang ketika Anda melakukan environment.getProperty("secret.property")
atau menggunakan @Value("${secret.property}")
yang Anda dapatkan adalah versi secret.property
yang didekripsi.
Saat menggunakan METODE 3 ( @EncryptablePropertySource
) maka Anda dapat mengakses properti terenkripsi dengan cara yang sama, satu-satunya perbedaan adalah Anda harus meletakkan properti di sumber daya yang dideklarasikan dalam anotasi @EncryptablePropertySource
agar properti dapat didekripsi dengan benar.
Jasypt menggunakan StringEncryptor
untuk mendekripsi properti. Untuk ketiga metode tersebut, jika tidak ada StringEncryptor
kustom (lihat bagian Enkripsi Kustom untuk detailnya) yang ditemukan di Konteks Musim Semi, metode akan dibuat secara otomatis yang dapat dikonfigurasi melalui properti berikut (Sistem, file properti, argumen baris perintah, variabel lingkungan, dll.):
Kunci | Diperlukan | Nilai Bawaan |
jasypt.encryptor.kata sandi | BENAR | - |
jasypt.encryptor.algorithm | PALSU | PBEDENGANHMACSHA512ANDAES_256 |
jasypt.encryptor.key-obtention-iterations | PALSU | 1000 |
jasypt.encryptor.ukuran kolam | PALSU | 1 |
jasypt.encryptor.nama penyedia | PALSU | SunJCE |
jasypt.encryptor.nama-kelas penyedia | PALSU | batal |
jasypt.encryptor.salt-generator-nama kelas | PALSU | org.jasypt.salt.RandomSaltGenerator |
jasypt.encryptor.iv-generator-nama kelas | PALSU | org.jasypt.iv.RandomIvGenerator |
jasypt.encryptor.string-output-type | PALSU | base64 |
jasypt.encryptor.proxy-property-sources | PALSU | PALSU |
jasypt.encryptor.skip-property-sources | PALSU | daftar kosong |
Satu-satunya properti yang diperlukan adalah kata sandi enkripsi, sisanya dapat dibiarkan menggunakan nilai default. Meskipun semua properti ini dapat dideklarasikan dalam file properti, kata sandi enkripsi tidak boleh disimpan dalam file properti, melainkan harus diteruskan sebagai properti sistem, argumen baris perintah, atau variabel lingkungan dan sejauh namanya jasypt.encryptor.password
itu akan berhasil.
Properti terakhir, jasypt.encryptor.proxyPropertySources
digunakan untuk menunjukkan jasyp-spring-boot
bagaimana nilai properti akan dicegat untuk dekripsi. Nilai defaultnya, false
menggunakan implementasi pembungkus khusus PropertySource
, EnumerablePropertySource
, dan MapPropertySource
. Jika true
ditentukan untuk properti ini, mekanisme intersepsi akan menggunakan proksi CGLib pada setiap implementasi PropertySource
tertentu. Ini mungkin berguna pada beberapa skenario di mana tipe PropertySource
asli harus dipertahankan.
Untuk konfigurasi khusus enkriptor dan sumber kata sandi enkriptor, Anda selalu dapat menentukan kacang StringEncryptor Anda sendiri di Konteks Musim Semi Anda, dan enkriptor default akan diabaikan. Misalnya:
@ Bean ( "jasyptStringEncryptor" )
public StringEncryptor stringEncryptor () {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor ();
SimpleStringPBEConfig config = new SimpleStringPBEConfig ();
config . setPassword ( "password" );
config . setAlgorithm ( "PBEWITHHMACSHA512ANDAES_256" );
config . setKeyObtentionIterations ( "1000" );
config . setPoolSize ( "1" );
config . setProviderName ( "SunJCE" );
config . setSaltGeneratorClassName ( "org.jasypt.salt.RandomSaltGenerator" );
config . setIvGeneratorClassName ( "org.jasypt.iv.RandomIvGenerator" );
config . setStringOutputType ( "base64" );
encryptor . setConfig ( config );
return encryptor ;
}
Perhatikan bahwa nama kacang diperlukan, karena jasypt-spring-boot
mendeteksi String Encryptor khusus berdasarkan nama pada versi 1.5
. Nama kacang default adalah:
jasyptStringEncryptor
Tapi kita juga bisa menimpanya dengan mendefinisikan properti:
jasypt.encryptor.bean
Jadi misalnya, jika Anda mendefinisikan jasypt.encryptor.bean=encryptorBean
maka Anda akan mendefinisikan encryptor khusus Anda dengan nama itu:
@ Bean ( "encryptorBean" )
public StringEncryptor stringEncryptor () {
...
}
Pada jasypt-spring-boot-1.10
ada poin ekstensi baru. EncryptablePropertySource
sekarang menggunakan EncryptablePropertyResolver
untuk menyelesaikan semua properti:
public interface EncryptablePropertyResolver {
String resolvePropertyValue ( String value );
}
Implementasi antarmuka ini bertanggung jawab untuk mendeteksi dan mendekripsi properti. Implementasi default, DefaultPropertyResolver
menggunakan StringEncryptor
yang disebutkan sebelumnya dan EncryptablePropertyDetector
baru.
EncryptablePropertyDetector
Khusus Anda dapat mengganti implementasi default dengan menyediakan Bean bertipe EncryptablePropertyDetector
dengan nama encryptablePropertyDetector
atau jika Anda ingin memberikan nama kacang Anda sendiri, ganti properti jasypt.encryptor.property.detector-bean
dan tentukan nama yang ingin Anda berikan pada kacang tersebut. Saat memberikan ini, Anda bertanggung jawab untuk mendeteksi properti terenkripsi. Contoh:
private static class MyEncryptablePropertyDetector implements EncryptablePropertyDetector {
@ Override
public boolean isEncrypted ( String value ) {
if ( value != null ) {
return value . startsWith ( "ENC@" );
}
return false ;
}
@ Override
public String unwrapEncryptedValue ( String value ) {
return value . substring ( "ENC@" . length ());
}
}
@ Bean ( name = "encryptablePropertyDetector" )
public EncryptablePropertyDetector encryptablePropertyDetector () {
return new MyEncryptablePropertyDetector ();
}
prefix
dan suffix
Properti Terenkripsi Khusus Jika yang ingin Anda lakukan hanyalah memiliki awalan/akhiran yang berbeda untuk properti terenkripsi, Anda dapat tetap menggunakan semua implementasi default dan hanya mengganti properti berikut di application.properties
(atau application.yml
):
jasypt :
encryptor :
property :
prefix : " ENC@[ "
suffix : " ] "
EncryptablePropertyResolver
Khusus Anda dapat mengganti implementasi default dengan menyediakan Bean bertipe EncryptablePropertyResolver
dengan nama encryptablePropertyResolver
atau jika Anda ingin memberikan nama kacang Anda sendiri, ganti properti jasypt.encryptor.property.resolver-bean
dan tentukan nama yang ingin Anda berikan pada kacang tersebut. Saat memberikan ini, Anda bertanggung jawab untuk mendeteksi dan mendekripsi properti terenkripsi. Contoh:
class MyEncryptablePropertyResolver implements EncryptablePropertyResolver {
private final PooledPBEStringEncryptor encryptor ;
public MyEncryptablePropertyResolver ( char [] password ) {
this . encryptor = new PooledPBEStringEncryptor ();
SimpleStringPBEConfig config = new SimpleStringPBEConfig ();
config . setPasswordCharArray ( password );
config . setAlgorithm ( "PBEWITHHMACSHA512ANDAES_256" );
config . setKeyObtentionIterations ( "1000" );
config . setPoolSize ( 1 );
config . setProviderName ( "SunJCE" );
config . setSaltGeneratorClassName ( "org.jasypt.salt.RandomSaltGenerator" );
config . setIvGeneratorClassName ( "org.jasypt.iv.RandomIvGenerator" );
config . setStringOutputType ( "base64" );
encryptor . setConfig ( config );
}
@ Override
public String resolvePropertyValue ( String value ) {
if ( value != null && value . startsWith ( "{cipher}" )) {
return encryptor . decrypt ( value . substring ( "{cipher}" . length ()));
}
return value ;
}
}
@ Bean ( name = "encryptablePropertyResolver" )
EncryptablePropertyResolver encryptablePropertyResolver ( @ Value ( "${jasypt.encryptor.password}" ) String password ) {
return new MyEncryptablePropertyResolver ( password . toCharArray ());
}
Perhatikan bahwa dengan mengganti EncryptablePropertyResolver
, konfigurasi atau penggantian apa pun yang mungkin Anda miliki untuk prefiks, sufiks, EncryptablePropertyDetector
, dan StringEncryptor
akan berhenti berfungsi karena Resolver defaultlah yang menggunakannya. Anda harus mengirimkan semua itu sendiri. Untungnya, Anda tidak perlu mengganti kacang ini dalam banyak kasus, opsi sebelumnya sudah cukup.
Namun seperti yang Anda lihat dalam implementasinya, deteksi dan dekripsi properti terenkripsi bersifat internal pada MyEncryptablePropertyResolver
jasypt-spring-boot:2.1.0
memperkenalkan fitur baru untuk menentukan filter properti. Filter ini merupakan bagian dari API EncryptablePropertyResolver
dan memungkinkan Anda menentukan properti atau sumber properti mana yang perlu didekripsi. Ini bahkan sebelum memeriksa nilai properti sebenarnya untuk mencari, atau mencoba, mendekripsinya. Misalnya, secara default, semua properti yang namanya dimulai dengan jasypt.encryptor
dikecualikan dari pemeriksaan. Hal ini untuk menghindari ketergantungan melingkar pada waktu buka ketika kacang perpustakaan dikonfigurasi.
Secara default, DefaultPropertyResolver
menggunakan DefaultPropertyFilter
, yang memungkinkan Anda menentukan daftar pola string berikut:
EncryptablePropertyFilter
khusus Anda dapat mengganti implementasi default dengan menyediakan Bean bertipe EncryptablePropertyFilter
dengan nama encryptablePropertyFilter
atau jika Anda ingin memberikan nama kacang Anda sendiri, ganti properti jasypt.encryptor.property.filter-bean
dan tentukan nama yang ingin Anda berikan pada kacang tersebut. Saat memberikan ini, Anda akan bertanggung jawab untuk mendeteksi properti dan/atau sumber properti yang ingin Anda pertimbangkan untuk dekripsi. Contoh:
class MyEncryptablePropertyFilter implements EncryptablePropertyFilter {
public boolean shouldInclude ( PropertySource <?> source , String name ) {
return name . startsWith ( 'encrypted.' );
}
}
@ Bean ( name = "encryptablePropertyFilter" )
EncryptablePropertyFilter encryptablePropertyFilter () {
return new MyEncryptablePropertyFilter ();
}
Perhatikan bahwa agar mekanisme ini berfungsi, Anda tidak boleh menyediakan EncryptablePropertyResolver
khusus dan menggunakan penyelesai default. Jika Anda menyediakan penyelesai khusus, Anda bertanggung jawab atas seluruh proses pendeteksian dan dekripsi properti.
PropertySource
agar tidak diintrospeksiTentukan daftar nama kelas yang sepenuhnya memenuhi syarat yang dipisahkan koma untuk dilewati dari introspeksi. Kelas-kelas ini tidak akan dibungkus/diproksikan oleh plugin ini dan dengan demikian properti yang terkandung di dalamnya tidak akan mendukung enkripsi/dekripsi:
jasypt.encryptor.skip-property-sources =org.springframework.boot.env.RandomValuePropertySource,org.springframework.boot.ansi.AnsiPropertySource
Properti terenkripsi di-cache dalam aplikasi Anda dan dalam skenario tertentu, seperti saat menggunakan konfigurasi eksternal dari server konfigurasi, properti perlu di-refresh ketika diubah. Untuk jasypt-spring-boot
ini mendaftarkan RefreshScopeRefreshedEventListener
yang mendengarkan kejadian berikut secara default untuk menghapus cache properti terenkripsi:
public static final List < String > EVENT_CLASS_NAMES = Arrays . asList (
"org.springframework.cloud.context.scope.refresh.RefreshScopeRefreshedEvent" ,
"org.springframework.cloud.context.environment.EnvironmentChangeEvent" ,
"org.springframework.boot.web.servlet.context.ServletWebServerInitializedEvent"
);
Jika Anda perlu mendaftarkan kejadian tambahan yang ingin memicu pembatalan cache terenkripsi, Anda dapat menambahkannya menggunakan properti berikut (pisahkan dengan koma jika diperlukan lebih dari satu):
jasypt.encryptor.refreshed-event-classes =org.springframework.boot.context.event.ApplicationStartedEvent
Plugin Maven dilengkapi dengan sejumlah utilitas bermanfaat.
Untuk menggunakan plugin, cukup tambahkan yang berikut ini ke pom.xml Anda:
< build >
< plugins >
< plugin >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-maven-plugin</ artifactId >
< version >3.0.5</ version >
</ plugin >
</ plugins >
</ build >
Saat menggunakan plugin ini, cara termudah untuk memberikan kata sandi enkripsi Anda adalah melalui properti sistem yaitu -Djasypt.encryptor.password="kata sandi".
Secara default, plugin akan mempertimbangkan konfigurasi enkripsi dalam file konfigurasi boot Spring standar di bawah ./src/main/resources. Anda juga dapat menggunakan properti sistem atau variabel lingkungan untuk menyediakan konfigurasi ini.
Ingatlah bahwa kode dan sumber daya aplikasi Anda yang lain tidak tersedia untuk plugin karena plugin Maven tidak berbagi jalur kelas dengan proyek. Jika aplikasi Anda menyediakan konfigurasi enkripsi melalui kacang StringEncryptor maka ini tidak akan diambil.
Secara umum, disarankan untuk hanya mengandalkan konfigurasi default yang aman.
Untuk mengenkripsi satu nilai, jalankan:
mvn jasypt:encrypt-value -Djasypt.encryptor.password= " the password " -Djasypt.plugin.value= " theValueYouWantToEncrypt "
Untuk mengenkripsi placeholder di src/main/resources/application.properties
, cukup bungkus string apa pun dengan DEC(...)
. Misalnya:
sensitive.password =DEC(secret value)
regular.property =example
Kemudian jalankan:
mvn jasypt:encrypt -Djasypt.encryptor.password= " the password "
Yang akan mengedit file itu sehingga menghasilkan:
sensitive.password =ENC(encrypted)
regular.property =example
Nama file dan lokasi dapat disesuaikan.
Untuk mendekripsi satu nilai, jalankan:
mvn jasypt:decrypt-value -Djasypt.encryptor.password= " the password " -Djasypt.plugin.value= " DbG1GppXOsFa2G69PnmADvQFI3esceEhJYbaEIKCcEO5C85JEqGAhfcjFMGnoRFf "
Untuk mendekripsi placeholder di src/main/resources/application.properties
, cukup bungkus string apa pun dengan ENC(...)
. Misalnya:
sensitive.password =ENC(encrypted)
regular.property =example
Ini dapat diuraikan sebagai berikut:
mvn jasypt:decrypt -Djasypt.encryptor.password= " the password "
Yang akan menampilkan konten yang didekripsi ke layar:
sensitive.password =DEC(decrypted)
regular.property =example
Perhatikan bahwa menampilkan keluaran ke layar, alih-alih mengedit file di tempatnya, dirancang untuk mengurangi penerapan nilai yang didekripsi secara tidak sengaja ke kontrol versi. Saat mendekripsi, kemungkinan besar Anda hanya ingin memeriksa nilai apa yang telah dienkripsi, daripada ingin mendekripsi nilai tersebut secara permanen.
Mengubah konfigurasi untuk properti terenkripsi yang ada agak canggung menggunakan tujuan enkripsi/dekripsi. Anda harus menjalankan tujuan dekripsi menggunakan konfigurasi lama, lalu menyalin kembali keluaran yang didekripsi ke file asli, lalu menjalankan tujuan enkripsi dengan konfigurasi baru.
Tujuan mengenkripsi ulang menyederhanakan hal ini dengan mengenkripsi ulang file di tempatnya. 2 set konfigurasi harus disediakan. Konfigurasi baru disediakan dengan cara yang sama seperti Anda mengonfigurasi sasaran maven lainnya. Konfigurasi lama disediakan melalui properti sistem yang diawali dengan "jasypt.plugin.old" dan bukan "jasypt.encryptor".
Misal untuk mengenkripsi ulang application.properties yang sebelumnya dienkripsi dengan password LAMA kemudian dienkripsi dengan password baru BARU:
mvn jasypt:reencrypt -Djasypt.plugin.old.password=OLD -Djasypt.encryptor.password=NEW
Catatan: Semua konfigurasi lama harus diteruskan sebagai properti sistem. Variabel lingkungan dan file konfigurasi Spring Boot tidak didukung.
Terkadang konfigurasi enkripsi default mungkin berubah antar versi jasypt-spring-boot. Anda dapat secara otomatis meningkatkan properti terenkripsi Anda ke default baru dengan tujuan peningkatan. Ini akan mendekripsi file application.properties Anda menggunakan konfigurasi default lama dan mengenkripsi ulang menggunakan konfigurasi default baru.
mvn jasypt:upgrade -Djasypt.encryptor.password=EXAMPLE
Anda juga dapat meneruskan properti sistem -Djasypt.plugin.old.major-version
untuk menentukan versi mana yang akan Anda tingkatkan. Ini akan selalu default ke versi besar terakhir yang konfigurasinya diubah. Saat ini, satu-satunya versi utama yang defaultnya diubah adalah versi 2, jadi properti ini tidak perlu disetel, tetapi properti ini ada untuk digunakan di masa mendatang.
Anda juga dapat mendekripsi file properti dan memuat semua propertinya ke dalam memori dan membuatnya dapat diakses oleh Maven. Ini berguna ketika Anda ingin membuat properti terenkripsi tersedia untuk plugin Maven lainnya.
Anda dapat merangkai tujuan dari plugin selanjutnya langsung setelah plugin ini. Misalnya dengan jalur terbang:
mvn jasypt:load flyway:migrate -Djasypt.encryptor.password= " the password "
Anda juga dapat menentukan awalan untuk setiap properti dengan -Djasypt.plugin.keyPrefix=example.
. Hal ini membantu menghindari potensi bentrokan dengan properti Maven lainnya.
Untuk semua utilitas di atas, jalur file yang Anda enkripsi/dekripsi defaultnya adalah file:src/main/resources/application.properties
.
Ini dapat diubah menggunakan properti sistem -Djasypt.plugin.path
.
Anda dapat mengenkripsi file di direktori sumber daya pengujian Anda:
mvn jasypt:encrypt -Djasypt.plugin.path= " file:src/main/test/application.properties " -Djasypt.encryptor.password= " the password "
Atau dengan nama lain:
mvn jasypt:encrypt -Djasypt.plugin.path= " file:src/main/resources/flyway.properties " -Djasypt.encryptor.password= " the password "
Atau dengan jenis file berbeda (plugin mendukung format file teks biasa apa pun termasuk YAML):
mvn jasypt:encrypt -Djasypt.plugin.path= " file:src/main/resources/application.yaml " -Djasypt.encryptor.password= " the password "
Perhatikan bahwa tujuan pemuatan hanya mendukung file .property
Anda dapat mengganti konfigurasi pegas apa pun yang Anda dukung di aplikasi Anda saat menjalankan plugin, misalnya memilih profil pegas tertentu:
mvn jasypt:encrypt -Dspring.profiles.active=cloud -Djasypt.encryptor.password= " the password "
Untuk mengenkripsi/mendekripsi properti dalam proyek multi-modul, nonaktifkan rekursi dengan -N
atau --non-recursive
pada perintah maven:
mvn jasypt:upgrade -Djasypt.plugin.path=file:server/src/test/resources/application-test.properties -Djasypt.encryptor.password=supersecret -N
jasypt-spring-boot:2.1.1
memperkenalkan fitur baru untuk mengenkripsi/mendekripsi properti menggunakan enkripsi asimetris dengan sepasang kunci pribadi/publik dalam format DER atau PEM.
Berikut ini adalah properti konfigurasi yang dapat Anda gunakan untuk mengonfigurasi dekripsi properti asimetris;
Kunci | Nilai Bawaan | Keterangan |
jasypt.encryptor.privateKeyString | batal | kunci pribadi untuk dekripsi dalam format String |
jasypt.encryptor.privateKeyLocation | batal | lokasi kunci pribadi untuk dekripsi dalam format sumber daya pegas |
jasypt.encryptor.privateKeyFormat | DER | Format kunci. DER atau PEM |
Anda harus menggunakan privateKeyString
atau privateKeyLocation
, format String akan diutamakan jika disetel. Untuk menentukan kunci pribadi dalam format DER dengan privateKeyString
, harap enkode byte kunci ke base64
.
Perhatikan bahwa jasypt.encryptor.password
masih diutamakan untuk enkripsi PBE dibandingkan konfigurasi asimetris.
jasypt :
encryptor :
privateKeyString: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCtB/IYK8E52CYMZTpyIY9U0HqMewyKnRvSo6s+9VNIn/HSh9+MoBGiADa2MaPKvetS3CD3CgwGq/+LIQ1HQYGchRrSORizOcIp7KBx+Wc1riatV/tcpcuFLC1j6QJ7d2I+T7RA98Sx8X39orqlYFQVysTw/aTawX/yajx0UlTW3rNAY+ykeQ0CBHowtTxKM9nGcxLoQbvbYx1iG9JgAqye7TYejOpviOH+BpD8To2S8zcOSojIhixEfayay0gURv0IKJN2LP86wkpAuAbL+mohUq1qLeWdTEBrIRXjlnrWs1M66w0l/6JwaFnGOqEB6haMzE4JWZULYYpr2yKyoGCRAgMBAAECggEAQxURhs1v3D0wgx27ywO3zeoFmPEbq6G9Z6yMd5wk7cMUvcpvoNVuAKCUlY4pMjDvSvCM1znN78g/CnGF9FoxJb106Iu6R8HcxOQ4T/ehS+54kDvL999PSBIYhuOPUs62B/Jer9FfMJ2veuXb9sGh19EFCWlMwILEV/dX+MDyo1qQaNzbzyyyaXP8XDBRDsvPL6fPxL4r6YHywfcPdBfTc71/cEPksG8ts6um8uAVYbLIDYcsWopjVZY/nUwsz49xBCyRcyPnlEUJedyF8HANfVEO2zlSyRshn/F+rrjD6aKBV/yVWfTEyTSxZrBPl4I4Tv89EG5CwuuGaSagxfQpAQKBgQDXEe7FqXSaGk9xzuPazXy8okCX5pT6545EmqTP7/JtkMSBHh/xw8GPp+JfrEJEAJJl/ISbdsOAbU+9KAXuPmkicFKbodBtBa46wprGBQ8XkR4JQoBFj1SJf7Gj9ozmDycozO2Oy8a1QXKhHUPkbPQ0+w3efwoYdfE67ZodpFNhswKBgQDN9eaYrEL7YyD7951WiK0joq0BVBLK3rwO5+4g9IEEQjhP8jSo1DP+zS495t5ruuuuPsIeodA79jI8Ty+lpYqqCGJTE6muqLMJDiy7KlMpe0NZjXrdSh6edywSz3YMX1eAP5U31pLk0itMDTf2idGcZfrtxTLrpRffumowdJ5qqwKBgF+XZ+JRHDN2aEM0atAQr1WEZGNfqG4Qx4o0lfaaNs1+H+knw5kIohrAyvwtK1LgUjGkWChlVCXb8CoqBODMupwFAqKL/IDImpUhc/t5uiiGZqxE85B3UWK/7+vppNyIdaZL13a1mf9sNI/p2whHaQ+3WoW/P3R5z5uaifqM1EbDAoGAN584JnUnJcLwrnuBx1PkBmKxfFFbPeSHPzNNsSK3ERJdKOINbKbaX+7DlT4bRVbWvVj/jcw/c2Ia0QTFpmOdnivjefIuehffOgvU8rsMeIBsgOvfiZGx0TP3+CCFDfRVqjIBt3HAfAFyZfiP64nuzOERslL2XINafjZW5T0pZz8CgYAJ3UbEMbKdvIuK+uTl54R1Vt6FO9T5bgtHR4luPKoBv1ttvSC6BlalgxA0Ts/AQ9tCsUK2JxisUcVgMjxBVvG0lfq/EHpL0Wmn59SHvNwtHU2qx3Ne6M0nQtneCCfR78OcnqQ7+L+3YCMqYGJHNFSard+dewfKoPnWw0WyGFEWCg==
jasypt :
encryptor :
privateKeyLocation : classpath:private_key.der
jasypt :
encryptor :
privateKeyFormat : PEM
privateKeyString : |-
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCtB/IYK8E52CYM
ZTpyIY9U0HqMewyKnRvSo6s+9VNIn/HSh9+MoBGiADa2MaPKvetS3CD3CgwGq/+L
IQ1HQYGchRrSORizOcIp7KBx+Wc1riatV/tcpcuFLC1j6QJ7d2I+T7RA98Sx8X39
orqlYFQVysTw/aTawX/yajx0UlTW3rNAY+ykeQ0CBHowtTxKM9nGcxLoQbvbYx1i
G9JgAqye7TYejOpviOH+BpD8To2S8zcOSojIhixEfayay0gURv0IKJN2LP86wkpA
uAbL+mohUq1qLeWdTEBrIRXjlnrWs1M66w0l/6JwaFnGOqEB6haMzE4JWZULYYpr
2yKyoGCRAgMBAAECggEAQxURhs1v3D0wgx27ywO3zeoFmPEbq6G9Z6yMd5wk7cMU
vcpvoNVuAKCUlY4pMjDvSvCM1znN78g/CnGF9FoxJb106Iu6R8HcxOQ4T/ehS+54
kDvL999PSBIYhuOPUs62B/Jer9FfMJ2veuXb9sGh19EFCWlMwILEV/dX+MDyo1qQ
aNzbzyyyaXP8XDBRDsvPL6fPxL4r6YHywfcPdBfTc71/cEPksG8ts6um8uAVYbLI
DYcsWopjVZY/nUwsz49xBCyRcyPnlEUJedyF8HANfVEO2zlSyRshn/F+rrjD6aKB
V/yVWfTEyTSxZrBPl4I4Tv89EG5CwuuGaSagxfQpAQKBgQDXEe7FqXSaGk9xzuPa
zXy8okCX5pT6545EmqTP7/JtkMSBHh/xw8GPp+JfrEJEAJJl/ISbdsOAbU+9KAXu
PmkicFKbodBtBa46wprGBQ8XkR4JQoBFj1SJf7Gj9ozmDycozO2Oy8a1QXKhHUPk
bPQ0+w3efwoYdfE67ZodpFNhswKBgQDN9eaYrEL7YyD7951WiK0joq0BVBLK3rwO
5+4g9IEEQjhP8jSo1DP+zS495t5ruuuuPsIeodA79jI8Ty+lpYqqCGJTE6muqLMJ
Diy7KlMpe0NZjXrdSh6edywSz3YMX1eAP5U31pLk0itMDTf2idGcZfrtxTLrpRff
umowdJ5qqwKBgF+XZ+JRHDN2aEM0atAQr1WEZGNfqG4Qx4o0lfaaNs1+H+knw5kI
ohrAyvwtK1LgUjGkWChlVCXb8CoqBODMupwFAqKL/IDImpUhc/t5uiiGZqxE85B3
UWK/7+vppNyIdaZL13a1mf9sNI/p2whHaQ+3WoW/P3R5z5uaifqM1EbDAoGAN584
JnUnJcLwrnuBx1PkBmKxfFFbPeSHPzNNsSK3ERJdKOINbKbaX+7DlT4bRVbWvVj/
jcw/c2Ia0QTFpmOdnivjefIuehffOgvU8rsMeIBsgOvfiZGx0TP3+CCFDfRVqjIB
t3HAfAFyZfiP64nuzOERslL2XINafjZW5T0pZz8CgYAJ3UbEMbKdvIuK+uTl54R1
Vt6FO9T5bgtHR4luPKoBv1ttvSC6BlalgxA0Ts/AQ9tCsUK2JxisUcVgMjxBVvG0
lfq/EHpL0Wmn59SHvNwtHU2qx3Ne6M0nQtneCCfR78OcnqQ7+L+3YCMqYGJHNFSa
rd+dewfKoPnWw0WyGFEWCg==
-----END PRIVATE KEY-----
jasypt :
encryptor :
privateKeyFormat : PEM
privateKeyLocation : classpath:private_key.pem
Tidak ada program/perintah untuk mengenkripsi properti menggunakan kunci asimetris tetapi Anda dapat menggunakan cuplikan kode berikut untuk mengenkripsi properti Anda:
import com . ulisesbocchio . jasyptspringboot . encryptor . SimpleAsymmetricConfig ;
import com . ulisesbocchio . jasyptspringboot . encryptor . SimpleAsymmetricStringEncryptor ;
import org . jasypt . encryption . StringEncryptor ;
public class PropertyEncryptor {
public static void main ( String [] args ) {
SimpleAsymmetricConfig config = new SimpleAsymmetricConfig ();
config . setPublicKey ( "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArQfyGCvBOdgmDGU6ciGPVNB6jHsMip0b0qOrPvVTSJ/x0offjKARogA2tjGjyr3rUtwg9woMBqv/iyENR0GBnIUa0jkYsznCKeygcflnNa4mrVf7XKXLhSwtY+kCe3diPk+0QPfEsfF9/aK6pWBUFcrE8P2k2sF/8mo8dFJU1t6zQGPspHkNAgR6MLU8SjPZxnMS6EG722MdYhvSYAKsnu02Hozqb4jh/gaQ/E6NkvM3DkqIyIYsRH2smstIFEb9CCiTdiz/OsJKQLgGy/pqIVKtai3lnUxAayEV45Z61rNTOusNJf+icGhZxjqhAeoWjMxOCVmVC2GKa9sisqBgkQIDAQAB" );
StringEncryptor encryptor = new SimpleAsymmetricStringEncryptor ( config );
String message = "chupacabras" ;
String encrypted = encryptor . encrypt ( message );
System . out . printf ( "Encrypted message %s n " , encrypted );
}
}
import com . ulisesbocchio . jasyptspringboot . encryptor . SimpleAsymmetricConfig ;
import com . ulisesbocchio . jasyptspringboot . encryptor . SimpleAsymmetricStringEncryptor ;
import org . jasypt . encryption . StringEncryptor ;
import static com . ulisesbocchio . jasyptspringboot . util . AsymmetricCryptography . KeyFormat . PEM ;
public class PropertyEncryptor {
public static void main ( String [] args ) {
SimpleAsymmetricConfig config = new SimpleAsymmetricConfig ();
config . setKeyFormat ( PEM );
config . setPublicKey ( "-----BEGIN PUBLIC KEY----- n " +
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArQfyGCvBOdgmDGU6ciGP n " +
"VNB6jHsMip0b0qOrPvVTSJ/x0offjKARogA2tjGjyr3rUtwg9woMBqv/iyENR0GB n " +
"nIUa0jkYsznCKeygcflnNa4mrVf7XKXLhSwtY+kCe3diPk+0QPfEsfF9/aK6pWBU n " +
"FcrE8P2k2sF/8mo8dFJU1t6zQGPspHkNAgR6MLU8SjPZxnMS6EG722MdYhvSYAKs n " +
"nu02Hozqb4jh/gaQ/E6NkvM3DkqIyIYsRH2smstIFEb9CCiTdiz/OsJKQLgGy/pq n " +
"IVKtai3lnUxAayEV45Z61rNTOusNJf+icGhZxjqhAeoWjMxOCVmVC2GKa9sisqBg n " +
"kQIDAQAB n " +
"-----END PUBLIC KEY----- n " );
StringEncryptor encryptor = new SimpleAsymmetricStringEncryptor ( config );
String message = "chupacabras" ;
String encrypted = encryptor . encrypt ( message );
System . out . printf ( "Encrypted message %s n " , encrypted );
}
}
Pada versi 3.0.5, Enkripsi AES 256-GCM didukung. Untuk menggunakan jenis enkripsi ini, setel properti jasypt.encryptor.gcm-secret-key-string
, jasypt.encryptor.gcm-secret-key-location
atau jasypt.encryptor.gcm-secret-key-password
.
Algoritme dasar yang digunakan adalah AES/GCM/NoPadding
jadi pastikan itu terinstal di JDK Anda.
SimpleGCMByteEncryptor
menggunakan IVGenerator
untuk mengenkripsi properti. Anda dapat mengonfigurasinya dengan properti jasypt.encryptor.iv-generator-classname
jika Anda tidak ingin menggunakan implementasi default RandomIvGenerator
Saat menggunakan kunci melalui jasypt.encryptor.gcm-secret-key-string
atau jasypt.encryptor.gcm-secret-key-location
, pastikan Anda mengkodekan kunci Anda di base64. Nilai string base64 dapat disetel ke jasypt.encryptor.gcm-secret-key-string
, atau cukup menyimpannya dalam file dan menggunakan pencari sumber daya pegas ke file tersebut di properti jasypt.encryptor.gcm-secret-key-location
. Misalnya:
jasypt.encryptor.gcm-secret-key-string = " PNG5egJcwiBrd+E8go1tb9PdPvuRSmLSV3jjXBmWlIU= "
# OR
jasypt.encryptor.gcm-secret-key-location =classpath:secret_key.b64
# OR
jasypt.encryptor.gcm-secret-key-location =file:/full/path/secret_key.b64
# OR
jasypt.encryptor.gcm-secret-key-location =file:relative/path/secret_key.b64
Secara opsional, Anda dapat membuat kacang StringEncryptor
Anda sendiri:
@ Bean ( "encryptorBean" )
public StringEncryptor stringEncryptor () {
SimpleGCMConfig config = new SimpleGCMConfig ();
config . setSecretKey ( "PNG5egJcwiBrd+E8go1tb9PdPvuRSmLSV3jjXBmWlIU=" );
return new SimpleGCMStringEncryptor ( config );
}
Alternatifnya, Anda dapat menggunakan kata sandi untuk mengenkripsi/mendekripsi properti menggunakan AES 256-GCM. Kata sandi digunakan untuk menghasilkan kunci pada saat startup, jadi ada beberapa properti yang perlu/dapat Anda atur, yaitu:
jasypt.encryptor.gcm-secret-key-password = " chupacabras "
# Optional, defaults to "1000"
jasypt.encryptor.key-obtention-iterations = " 1000 "
# Optional, defaults to 0, no salt. If provided, specify the salt string in ba64 format
jasypt.encryptor.gcm-secret-key-salt = " HrqoFr44GtkAhhYN+jP8Ag== "
# Optional, defaults to PBKDF2WithHmacSHA256
jasypt.encryptor.gcm-secret-key-algorithm = " PBKDF2WithHmacSHA256 "
Pastikan parameter ini sama jika Anda mengenkripsi rahasia Anda dengan alat eksternal. Secara opsional, Anda dapat membuat kacang StringEncryptor
Anda sendiri:
@ Bean ( "encryptorBean" )
public StringEncryptor stringEncryptor () {
SimpleGCMConfig config = new SimpleGCMConfig ();
config . setSecretKeyPassword ( "chupacabras" );
config . setSecretKeyIterations ( 1000 );
config . setSecretKeySalt ( "HrqoFr44GtkAhhYN+jP8Ag==" );
config . setSecretKeyAlgorithm ( "PBKDF2WithHmacSHA256" );
return new SimpleGCMStringEncryptor ( config );
}
Anda dapat menggunakan Plugin Maven atau mengikuti strategi serupa seperti yang dijelaskan dalam Properti Enkripsi Enkripsi Asimetris
Repo jasypt-spring-boot-demo-samples berisi contoh aplikasi Spring Boot yang berfungsi. Aplikasi Demo jasypt-spring-boot-demo utama secara eksplisit menetapkan properti Sistem dengan kata sandi enkripsi sebelum aplikasi berjalan. Untuk mendapatkan skenario yang lebih realistis, coba hapus baris di mana properti sistem disetel, buat aplikasi dengan maven, dan jalankan:
java -jar target/jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar --jasypt.encryptor.password=password
Dan Anda akan meneruskan kata sandi enkripsi sebagai argumen baris perintah. Jalankan seperti ini:
java -Djasypt.encryptor.password=password -jar target/jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar
Dan Anda akan meneruskan kata sandi enkripsi sebagai properti Sistem.
Jika Anda perlu meneruskan properti ini sebagai Variabel Lingkungan, Anda dapat melakukannya dengan membuat application.properties atau application.yml dan menambahkan:
jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD:}
atau di YAML
jasypt:
encryptor:
password: ${JASYPT_ENCRYPTOR_PASSWORD:}
pada dasarnya apa yang dilakukannya adalah mendefinisikan properti jasypt.encryptor.password
yang menunjuk ke properti berbeda JASYPT_ENCRYPTOR_PASSWORD
yang dapat Anda atur dengan Variabel Lingkungan, dan Anda juga dapat menggantinya melalui System Properties. Teknik ini juga dapat digunakan untuk menerjemahkan nama/nilai properti untuk perpustakaan lain yang Anda perlukan. Ini juga tersedia di aplikasi Demo. Jadi Anda dapat menjalankan aplikasi Demo seperti ini:
JASYPT_ENCRYPTOR_PASSWORD=password java -jar target/jasypt-spring-boot-demo-1.5-SNAPSHOT.jar
Catatan: Saat menggunakan Gradle sebagai alat pembangunan, tugas processResources gagal karena karakter '$', untuk mengatasinya Anda hanya perlu melakukan scape pada variabel ini seperti ini '$'.
Meskipun jasypt-spring-boot-demo adalah Demo komprehensif yang menampilkan semua cara yang mungkin untuk mengenkripsi/mendekripsi properti, ada beberapa Demo lain yang mendemonstrasikan skenario terisolasi.