การรวม Jasypt สำหรับ Spring boot 2.x และ 3.0.0
Jasypt Spring Boot ให้การสนับสนุนการเข้ารหัสสำหรับแหล่งที่มาของคุณสมบัติใน Spring Boot Applications
มี 3 วิธีในการรวม jasypt-spring-boot
ในโครงการของคุณ:
jasypt-spring-boot-starter
ให้กับ classpath ของคุณหากใช้ @SpringBootApplication
หรือ @EnableAutoConfiguration
จะเปิดใช้งานคุณสมบัติที่เข้ารหัสได้ทั่วทั้ง Spring Environmentjasypt-spring-boot
ให้กับ classpath ของคุณและเพิ่ม @EnableEncryptableProperties
ให้กับคลาสการกำหนดค่าหลักของคุณเพื่อเปิดใช้งานคุณสมบัติที่เข้ารหัสได้ทั่วทั้ง Spring Environmentjasypt-spring-boot
ให้กับ classpath ของคุณและประกาศแหล่งคุณสมบัติที่เข้ารหัสได้แต่ละรายการด้วย @EncrytablePropertySource
ใช้หนึ่งใน 3 วิธีต่อไปนี้ (อธิบายโดยย่อด้านบน):
เพียงเพิ่มการพึ่งพา jar เริ่มต้นให้กับโปรเจ็กต์ของคุณ หากแอปพลิเคชัน Spring Boot ของคุณใช้ @SpringBootApplication
หรือ @EnableAutoConfiguration
และคุณสมบัติที่เข้ารหัสได้จะถูกเปิดใช้งานทั่วทั้ง Spring Environment (ซึ่งหมายถึงคุณสมบัติของระบบ คุณสมบัติสภาพแวดล้อม อาร์กิวเมนต์บรรทัดคำสั่ง application.properties แอปพลิเคชัน -*.properties คุณสมบัติ yaml และแหล่งที่มาของคุณสมบัติอื่นๆ สามารถมีคุณสมบัติที่เข้ารหัสได้):
< dependency >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-spring-boot-starter</ artifactId >
< version >3.0.5</ version >
</ dependency >
หากคุณไม่ได้ใช้คำอธิบายประกอบ @SpringBootApplication
หรือ @EnableAutoConfiguration
Auto Configuration ให้เพิ่มการพึ่งพานี้ให้กับโปรเจ็กต์ของคุณ:
< dependency >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-spring-boot</ artifactId >
< version >3.0.5</ version >
</ dependency >
จากนั้นเพิ่ม @EnableEncryptableProperties
ให้กับคลาสการกำหนดค่าของคุณ ตัวอย่างเช่น:
@ Configuration
@ EnableEncryptableProperties
public class MyApplication {
...
}
และคุณสมบัติที่เข้ารหัสได้จะถูกเปิดใช้งานทั่วทั้ง Spring Environment (ซึ่งหมายความว่าคุณสมบัติของระบบ คุณสมบัติสภาพแวดล้อม อาร์กิวเมนต์บรรทัดคำสั่ง application.properties คุณสมบัติ yaml และแหล่งที่มาของคุณสมบัติแบบกำหนดเองอื่น ๆ สามารถมีคุณสมบัติที่เข้ารหัสได้)
หากคุณไม่ได้ใช้คำอธิบายประกอบ @SpringBootApplication
หรือ @EnableAutoConfiguration
Auto Configuration และคุณไม่ต้องการเปิดใช้งานคุณสมบัติที่เข้ารหัสได้ทั่วทั้ง Spring Environment มีตัวเลือกที่สาม ขั้นแรกให้เพิ่มการพึ่งพาต่อไปนี้ให้กับโครงการของคุณ:
< dependency >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-spring-boot</ artifactId >
< version >3.0.5</ version >
</ dependency >
จากนั้นเพิ่มคำอธิบายประกอบ @EncryptablePropertySource
ได้มากเท่าที่คุณต้องการในไฟล์การกำหนดค่าของคุณ เช่นเดียวกับที่คุณทำกับคำอธิบายประกอบ @PropertySource
ของ Spring ตัวอย่างเช่น:
@ Configuration
@ EncryptablePropertySource ( name = "EncryptedProperties" , value = "classpath:encrypted.properties" )
public class MyApplication {
...
}
สะดวก ยังมีคำอธิบายประกอบ @EncryptablePropertySources
ที่สามารถใช้เพื่อจัดกลุ่มคำอธิบายประกอบประเภท @EncryptablePropertySource
เช่นนี้:
@ Configuration
@ EncryptablePropertySources ({ @ EncryptablePropertySource ( "classpath:encrypted.properties" ),
@ EncryptablePropertySource ( "classpath:encrypted2.properties" )})
public class MyApplication {
...
}
นอกจากนี้ โปรดทราบว่าในเวอร์ชัน 1.8 @EncryptablePropertySource
รองรับไฟล์ YAML
ณ รุ่น 1.7 เวอร์ชัน 1.15 มีวิธีที่ 4 ในการเปิดใช้งานคุณสมบัติที่เข้ารหัสได้สำหรับบางกรณีพิเศษ คลาส ConfigurableEnvironment
แบบกำหนดเองถูกจัดเตรียมไว้: EncryptableEnvironment
StandardEncryptableEnvironment
และ StandardEncryptableServletEnvironment
ที่สามารถใช้กับ SpringApplicationBuilder
เพื่อกำหนดสภาพแวดล้อมที่กำหนดเองด้วยวิธีนี้:
new SpringApplicationBuilder ()
. environment ( new StandardEncryptableEnvironment ())
. sources ( YourApplicationClass . class ). run ( args );
วิธีนี้จะต้องใช้การพึ่งพาสำหรับ jasypt-spring-boot
เท่านั้น ไม่จำเป็นต้องมีการพึ่งพา jar เริ่มต้น วิธีการนี้มีประโยชน์สำหรับการเข้าถึงคุณสมบัติที่เข้ารหัสบนบูตสแตรปก่อนใคร แม้ว่าไม่จำเป็นในสถานการณ์ส่วนใหญ่อาจมีประโยชน์เมื่อปรับแต่งพฤติกรรมเริ่มต้นของ Spring Boot หรือบูรณาการเข้ากับความสามารถบางอย่างที่ได้รับการกำหนดค่าตั้งแต่เนิ่นๆ เช่น การกำหนดค่าการบันทึก สำหรับตัวอย่างที่เป็นรูปธรรม วิธีการเปิดใช้งานคุณสมบัติที่เข้ารหัสได้นี้เป็นวิธีการเดียวที่ใช้ได้กับการแทนที่ Spring Properties ในไฟล์ logback-spring.xml
โดยใช้แท็ก springProperty
ตัวอย่างเช่น:
< 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 >
กลไกนี้สามารถนำมาใช้เป็นตัวอย่าง (ตามที่แสดง) เพื่อเริ่มต้นฐานข้อมูล Logging Appender ที่ต้องใช้ข้อมูลรับรองที่ละเอียดอ่อนในการส่งผ่าน อีกทางหนึ่ง หากจำเป็นต้องจัดเตรียม StringEncryptor
แบบกำหนดเอง จะมีการเตรียมเมธอดตัวสร้างแบบคง StandardEncryptableEnvironment#builder
ไว้สำหรับการกำหนดเอง (สามารถปรับแต่งอื่นๆ ได้):
StandardEncryptableEnvironment
. builder ()
. encryptor ( new MyEncryptor ())
. build ()
สิ่งนี้จะทริกเกอร์การกำหนดค่าบางอย่างให้โหลดซึ่งโดยพื้นฐานแล้วจะทำ 2 สิ่ง:
StringEncryptor
เริ่มต้นที่สามารถกำหนดค่าผ่านคุณสมบัติปกติ คุณสมบัติของระบบ หรืออาร์กิวเมนต์บรรทัดคำสั่ง เมื่อใช้วิธีที่ 1 และ 2 คุณสามารถกำหนดคุณสมบัติที่เข้ารหัสใน PropertySource ที่มีอยู่ในสภาพแวดล้อมได้ ตัวอย่างเช่น การใช้คำอธิบายประกอบ @PropertySource:
@ SpringBootApplication
@ EnableEncryptableProperties
@ PropertySource ( name = "EncryptedProperties" , value = "classpath:encrypted.properties" )
public class MyApplication {
...
}
และไฟล์ encrypted.properties ของคุณจะมีลักษณะดังนี้:
secret.property =ENC(nrmZtkF7T0kjG/VodDvBw93Ct8EgjCA+)
ตอนนี้เมื่อคุณทำ environment.getProperty("secret.property")
หรือใช้ @Value("${secret.property}")
สิ่งที่คุณได้รับคือเวอร์ชันถอดรหัสของ secret.property
เมื่อใช้วิธีที่ 3 ( @EncryptablePropertySource
) คุณจะสามารถเข้าถึงคุณสมบัติที่เข้ารหัสได้ในลักษณะเดียวกัน ข้อแตกต่างเพียงอย่างเดียวคือคุณต้องใส่คุณสมบัติลงในทรัพยากรที่ได้รับการประกาศภายในคำอธิบายประกอบ @EncryptablePropertySource
เพื่อให้สามารถถอดรหัสคุณสมบัติได้อย่างถูกต้อง
Jasypt ใช้ StringEncryptor
เพื่อถอดรหัสคุณสมบัติ สำหรับทั้ง 3 วิธี หากไม่มี StringEncryptor
แบบกำหนดเอง (ดูรายละเอียดในส่วน Custom Encryptor) ใน Spring Context วิธีหนึ่งจะถูกสร้างขึ้นโดยอัตโนมัติซึ่งสามารถกำหนดค่าผ่านคุณสมบัติต่อไปนี้ (ระบบ ไฟล์คุณสมบัติ อาร์กิวเมนต์บรรทัดคำสั่ง ตัวแปรสภาพแวดล้อม ฯลฯ ):
สำคัญ | ที่จำเป็น | ค่าเริ่มต้น |
jasypt.encryptor.password | จริง | - |
jasypt.encryptor.อัลกอริทึม | เท็จ | PBEWITHHMACSHA512ANDAES_256 |
jasypt.encryptor.key-obtention-ซ้ำ | เท็จ | 1,000 |
jasypt.encryptor.pool-size | เท็จ | 1 |
jasypt.encryptor.provider ชื่อ | เท็จ | ซันเจซีอี |
jasypt.encryptor.provider-คลาสชื่อ | เท็จ | โมฆะ |
jasypt.encryptor.salt-generator-classname | เท็จ | org.jasypt.salt.RandomSaltGenerator |
jasypt.encryptor.iv-เครื่องกำเนิดไฟฟ้า-classname | เท็จ | org.jasypt.iv.RandomIvGenerator |
jasypt.encryptor.string-output-type | เท็จ | ฐาน64 |
jasypt.encryptor.proxy-property-sources | เท็จ | เท็จ |
jasypt.encryptor.skip-property-sources | เท็จ | รายการว่างเปล่า |
คุณสมบัติเดียวที่ต้องการคือรหัสผ่านการเข้ารหัส ส่วนที่เหลือสามารถปล่อยให้ใช้ค่าเริ่มต้นได้ แม้ว่าคุณสมบัติทั้งหมดนี้สามารถประกาศในไฟล์คุณสมบัติได้ แต่ไม่ควรเก็บรหัสผ่านตัวเข้ารหัสไว้ในไฟล์คุณสมบัติ แต่ควรส่งผ่านเป็นคุณสมบัติของระบบ อาร์กิวเมนต์บรรทัดคำสั่ง หรือตัวแปรสภาพแวดล้อม และเท่าที่ชื่อคือ jasypt.encryptor.password
มันจะใช้งานได้
คุณสมบัติสุดท้าย jasypt.encryptor.proxyPropertySources
ใช้เพื่อระบุ jasyp-spring-boot
ว่าค่าคุณสมบัติจะถูกดักจับเพื่อถอดรหัสอย่างไร ค่าเริ่มต้น false
จะใช้ wrapper แบบกำหนดเองของ PropertySource
, EnumerablePropertySource
และ MapPropertySource
เมื่อระบุ true
สำหรับคุณสมบัตินี้ กลไกการสกัดกั้นจะใช้พร็อกซี CCGib ในการใช้งาน PropertySource
เฉพาะแต่ละรายการ ซึ่งอาจมีประโยชน์ในบางสถานการณ์ที่ต้องรักษาชนิดของ PropertySource
ดั้งเดิมไว้
สำหรับการกำหนดค่าแบบกำหนดเองของตัวเข้ารหัสและแหล่งที่มาของรหัสผ่านตัวเข้ารหัส คุณสามารถกำหนด StringEncryptor bean ของคุณเองใน Spring Context ของคุณได้เสมอ และตัวเข้ารหัสเริ่มต้นจะถูกละเว้น ตัวอย่างเช่น:
@ 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 ;
}
โปรดสังเกตว่าจำเป็นต้องมีชื่อ bean เนื่องจาก jasypt-spring-boot
ตรวจพบ String Encyptors แบบกำหนดเองตามชื่อในเวอร์ชัน 1.5
ชื่อ bean เริ่มต้นคือ:
jasyptStringEncryptor
แต่เราสามารถแทนที่สิ่งนี้ได้ด้วยการกำหนดคุณสมบัติ:
jasypt.encryptor.bean
ตัวอย่างเช่น หากคุณกำหนด jasypt.encryptor.bean=encryptorBean
คุณจะต้องกำหนดตัวเข้ารหัสที่คุณกำหนดเองด้วยชื่อนั้น:
@ Bean ( "encryptorBean" )
public StringEncryptor stringEncryptor () {
...
}
ตั้งแต่ jasypt-spring-boot-1.10
มีจุดส่วนขยายใหม่ ตอนนี้ EncryptablePropertySource
ใช้ EncryptablePropertyResolver
เพื่อแก้ไขคุณสมบัติทั้งหมด:
public interface EncryptablePropertyResolver {
String resolvePropertyValue ( String value );
}
การใช้งานอินเทอร์เฟซนี้มีหน้าที่รับผิดชอบทั้ง การตรวจจับ และ ถอดรหัส คุณสมบัติ การใช้งานเริ่มต้น DefaultPropertyResolver
ใช้ StringEncryptor
ที่กล่าวถึงก่อนหน้านี้และ EncryptablePropertyDetector
ใหม่
EncryptablePropertyDetector
แบบกำหนดเอง คุณสามารถแทนที่การใช้งานเริ่มต้นได้โดยระบุ Bean ประเภท EncryptablePropertyDetector
ด้วยชื่อ encryptablePropertyDetector
หรือหากคุณต้องการระบุชื่อ bean ของคุณเอง ให้แทนที่คุณสมบัติ jasypt.encryptor.property.detector-bean
และระบุชื่อที่คุณต้องการตั้งให้กับ bean เมื่อระบุสิ่งนี้ คุณจะต้องรับผิดชอบในการตรวจจับคุณสมบัติที่เข้ารหัส ตัวอย่าง:
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
และ suffix
คุณสมบัติการเข้ารหัสแบบกำหนดเอง หากสิ่งที่คุณต้องการทำคือการมีคำนำหน้า/คำต่อท้ายที่แตกต่างกันสำหรับคุณสมบัติที่เข้ารหัส คุณสามารถใช้การใช้งานเริ่มต้นทั้งหมดต่อไปได้ และเพียงแทนที่คุณสมบัติต่อไปนี้ใน application.properties
(หรือ application.yml
):
jasypt :
encryptor :
property :
prefix : " ENC@[ "
suffix : " ] "
EncryptablePropertyResolver
แบบกำหนดเอง คุณสามารถแทนที่การใช้งานเริ่มต้นได้โดยระบุ Bean ประเภท EncryptablePropertyResolver
ด้วยชื่อ encryptablePropertyResolver
หรือหากคุณต้องการระบุชื่อ bean ของคุณเอง ให้แทนที่คุณสมบัติ jasypt.encryptor.property.resolver-bean
และระบุชื่อที่คุณต้องการตั้งให้กับ bean เมื่อระบุสิ่งนี้ คุณจะต้องรับผิดชอบในการตรวจจับและถอดรหัสคุณสมบัติที่เข้ารหัส ตัวอย่าง:
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 ());
}
โปรดสังเกตว่าโดยการแทนที่ EncryptablePropertyResolver
การกำหนดค่าหรือการแทนที่อื่นใดที่คุณอาจมีสำหรับคำนำหน้า ส่วนต่อท้าย EncryptablePropertyDetector
และ StringEncryptor
จะหยุดทำงานเนื่องจากตัวแก้ไขเริ่มต้นคือสิ่งที่ใช้งาน คุณจะต้องวางสายทุกอย่างด้วยตัวเอง โชคดีที่คุณไม่จำเป็นต้องแทนที่ bean นี้ในกรณีส่วนใหญ่ ตัวเลือกก่อนหน้านี้ก็น่าจะเพียงพอแล้ว
แต่อย่างที่คุณเห็นในการใช้งาน การตรวจจับและการถอดรหัสคุณสมบัติที่เข้ารหัสนั้นอยู่ภายใน MyEncryptablePropertyResolver
jasypt-spring-boot:2.1.0
แนะนำคุณสมบัติใหม่เพื่อระบุตัวกรองคุณสมบัติ ตัวกรองเป็นส่วนหนึ่งของ EncryptablePropertyResolver
API และช่วยให้คุณสามารถกำหนดคุณสมบัติหรือแหล่งที่มาของคุณสมบัติที่จะพิจารณาสำหรับการถอดรหัส ก่อนที่จะตรวจสอบมูลค่าทรัพย์สินจริงเพื่อค้นหาหรือพยายามถอดรหัส ตัวอย่างเช่น ตามค่าเริ่มต้น คุณสมบัติทั้งหมดที่ชื่อขึ้นต้นด้วย jasypt.encryptor
จะไม่รวมอยู่ในการตรวจสอบ นี่เป็นการหลีกเลี่ยงการพึ่งพาแบบวงกลมในเวลาโหลดเมื่อมีการกำหนดค่าไลบรารี่ bean
ตามค่าดีฟอลต์ DefaultPropertyResolver
จะใช้ DefaultPropertyFilter
ซึ่งอนุญาตให้คุณระบุรายการรูปแบบสตริงต่อไปนี้:
EncryptablePropertyFilter
แบบกำหนดเอง คุณสามารถแทนที่การใช้งานเริ่มต้นได้โดยระบุ Bean ประเภท EncryptablePropertyFilter
ด้วยชื่อ encryptablePropertyFilter
หรือหากคุณต้องการระบุชื่อ bean ของคุณเอง ให้แทนที่คุณสมบัติ jasypt.encryptor.property.filter-bean
และระบุชื่อที่คุณต้องการตั้งให้กับ bean เมื่อระบุสิ่งนี้ คุณจะต้องรับผิดชอบในการตรวจจับคุณสมบัติและ/หรือแหล่งที่มาของคุณสมบัติที่คุณต้องการพิจารณาสำหรับการถอดรหัส ตัวอย่าง:
class MyEncryptablePropertyFilter implements EncryptablePropertyFilter {
public boolean shouldInclude ( PropertySource <?> source , String name ) {
return name . startsWith ( 'encrypted.' );
}
}
@ Bean ( name = "encryptablePropertyFilter" )
EncryptablePropertyFilter encryptablePropertyFilter () {
return new MyEncryptablePropertyFilter ();
}
โปรดสังเกตว่าเพื่อให้กลไกนี้ใช้งานได้ คุณไม่ควรจัดเตรียม EncryptablePropertyResolver
แบบกำหนดเอง และใช้ตัวแก้ไขเริ่มต้นแทน หากคุณจัดเตรียมตัวแก้ไขแบบกำหนดเอง คุณจะต้องรับผิดชอบกระบวนการตรวจจับและถอดรหัสคุณสมบัติทั้งหมด
PropertySource
ไม่ให้ถูกวิพากษ์วิจารณ์กำหนดรายการชื่อคลาสที่มีคุณสมบัติครบถ้วนโดยคั่นด้วยเครื่องหมายจุลภาคเพื่อข้ามไปจากการวิปัสสนา คลาสนี้จะไม่ถูกห่อ/พร็อกซีโดยปลั๊กอินนี้ และด้วยเหตุนี้คุณสมบัติที่มีอยู่ในคลาสจึงไม่รองรับการเข้ารหัส/ถอดรหัส:
jasypt.encryptor.skip-property-sources =org.springframework.boot.env.RandomValuePropertySource,org.springframework.boot.ansi.AnsiPropertySource
คุณสมบัติที่เข้ารหัสจะถูกแคชไว้ภายในแอปพลิเคชันของคุณ และในบางสถานการณ์ เช่น เมื่อใช้การกำหนดค่าภายนอกจากเซิร์ฟเวอร์การกำหนดค่า คุณสมบัติจะต้องได้รับการรีเฟรชเมื่อมีการเปลี่ยนแปลง สำหรับ jasypt-spring-boot
นี้จะลงทะเบียน RefreshScopeRefreshedEventListener
ที่รับฟังเหตุการณ์ต่อไปนี้ตามค่าเริ่มต้นเพื่อล้างแคชคุณสมบัติที่เข้ารหัส:
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"
);
หากคุณต้องการลงทะเบียนเหตุการณ์พิเศษที่คุณต้องการกระตุ้นให้แคชที่เข้ารหัสใช้งานไม่ได้ คุณสามารถเพิ่มเหตุการณ์เหล่านั้นได้โดยใช้คุณสมบัติต่อไปนี้ (คั่นด้วยเครื่องหมายจุลภาคหากจำเป็นมากกว่าหนึ่งรายการ):
jasypt.encryptor.refreshed-event-classes =org.springframework.boot.context.event.ApplicationStartedEvent
ปลั๊กอิน Maven มาพร้อมกับยูทิลิตี้ที่มีประโยชน์มากมาย
หากต้องการใช้ปลั๊กอิน เพียงเพิ่มสิ่งต่อไปนี้ใน pom.xml ของคุณ:
< build >
< plugins >
< plugin >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-maven-plugin</ artifactId >
< version >3.0.5</ version >
</ plugin >
</ plugins >
</ build >
เมื่อใช้ปลั๊กอินนี้ วิธีที่ง่ายที่สุดในการระบุรหัสผ่านการเข้ารหัสของคุณคือผ่านคุณสมบัติของระบบ เช่น -Djasypt.encryptor.password="thepassword"
ตามค่าเริ่มต้น ปลั๊กอินจะพิจารณาการกำหนดค่าการเข้ารหัสในไฟล์การกำหนดค่า Spring boot มาตรฐานภายใต้ ./src/main/resources คุณยังสามารถใช้คุณสมบัติของระบบหรือตัวแปรสภาพแวดล้อมเพื่อจัดเตรียมการกำหนดค่านี้ได้
โปรดทราบว่าโค้ดแอปพลิเคชันและทรัพยากรที่เหลือของคุณไม่พร้อมใช้งานสำหรับปลั๊กอินเนื่องจากปลั๊กอิน Maven ไม่ได้แชร์ classpath กับโปรเจ็กต์ หากแอปพลิเคชันของคุณมีการกำหนดค่าการเข้ารหัสผ่าน StringEncryptor bean สิ่งนี้จะไม่ถูกหยิบขึ้นมา
โดยทั่วไป ขอแนะนำให้อาศัยการกำหนดค่าเริ่มต้นที่ปลอดภัยเท่านั้น
หากต้องการเข้ารหัสค่าเดียวให้รัน:
mvn jasypt:encrypt-value -Djasypt.encryptor.password= " the password " -Djasypt.plugin.value= " theValueYouWantToEncrypt "
หากต้องการเข้ารหัสตัวยึดตำแหน่งใน src/main/resources/application.properties
เพียงพันสตริงด้วย DEC(...)
ตัวอย่างเช่น:
sensitive.password =DEC(secret value)
regular.property =example
จากนั้นเรียกใช้:
mvn jasypt:encrypt -Djasypt.encryptor.password= " the password "
ซึ่งจะแก้ไขไฟล์นั้นให้เข้าที่ส่งผลให้:
sensitive.password =ENC(encrypted)
regular.property =example
สามารถปรับแต่งชื่อไฟล์และตำแหน่งได้
หากต้องการถอดรหัสค่าเดียวให้รัน:
mvn jasypt:decrypt-value -Djasypt.encryptor.password= " the password " -Djasypt.plugin.value= " DbG1GppXOsFa2G69PnmADvQFI3esceEhJYbaEIKCcEO5C85JEqGAhfcjFMGnoRFf "
หากต้องการถอดรหัสตัวยึดตำแหน่งใน src/main/resources/application.properties
เพียงพันสตริงด้วย ENC(...)
ตัวอย่างเช่น:
sensitive.password =ENC(encrypted)
regular.property =example
สิ่งนี้สามารถถอดรหัสได้ดังนี้:
mvn jasypt:decrypt -Djasypt.encryptor.password= " the password "
ซึ่งจะส่งออกเนื้อหาที่ถอดรหัสไปที่หน้าจอ:
sensitive.password =DEC(decrypted)
regular.property =example
โปรดทราบว่าการส่งออกไปยังหน้าจอ แทนที่จะแก้ไขไฟล์ในสถานที่นั้น ได้รับการออกแบบมาเพื่อลดการส่งข้อมูลที่ถอดรหัสไปยังการควบคุมเวอร์ชันโดยไม่ตั้งใจ เมื่อถอดรหัส คุณมักจะเพียงต้องการตรวจสอบว่าค่าใดที่ถูกเข้ารหัส แทนที่จะต้องการถอดรหัสค่านั้นอย่างถาวร
การเปลี่ยนการกำหนดค่าสำหรับคุณสมบัติที่เข้ารหัสที่มีอยู่นั้นไม่สะดวกเล็กน้อยเมื่อใช้เป้าหมายการเข้ารหัส/ถอดรหัส คุณต้องรันเป้าหมายการถอดรหัสโดยใช้การกำหนดค่าเก่า จากนั้นคัดลอกเอาต์พุตที่ถอดรหัสแล้วกลับไปยังไฟล์ต้นฉบับ จากนั้นรันเป้าหมายการเข้ารหัสด้วยการกำหนดค่าใหม่
เป้าหมายการเข้ารหัสใหม่จะทำให้สิ่งนี้ง่ายขึ้นโดยการเข้ารหัสไฟล์อีกครั้ง ต้องมีการกำหนดค่า 2 ชุด การกำหนดค่าใหม่มีให้ในลักษณะเดียวกับที่คุณกำหนดค่าเป้าหมาย Maven อื่นๆ การกำหนดค่าเก่าได้รับการจัดหาผ่านคุณสมบัติของระบบที่ขึ้นต้นด้วย "jasypt.plugin.old" แทนที่จะเป็น "jasypt.encryptor"
ตัวอย่างเช่น หากต้องการเข้ารหัส application.properties อีกครั้งซึ่งเคยเข้ารหัสด้วยรหัสผ่าน OLD แล้วจึงเข้ารหัสด้วยรหัสผ่านใหม่ NEW:
mvn jasypt:reencrypt -Djasypt.plugin.old.password=OLD -Djasypt.encryptor.password=NEW
หมายเหตุ: การกำหนดค่าเก่าทั้งหมดจะต้องส่งผ่านเป็นคุณสมบัติของระบบ ไม่รองรับตัวแปรสภาพแวดล้อมและไฟล์การกำหนดค่า Spring Boot
บางครั้งการกำหนดค่าการเข้ารหัสเริ่มต้นอาจเปลี่ยนแปลงระหว่างเวอร์ชันของ jasypt-spring-boot คุณสามารถอัปเกรดคุณสมบัติที่เข้ารหัสของคุณเป็นค่าเริ่มต้นใหม่โดยอัตโนมัติโดยมีเป้าหมายการอัปเกรด วิธีนี้จะถอดรหัสไฟล์ application.properties ของคุณโดยใช้การกำหนดค่าเริ่มต้นแบบเก่า และเข้ารหัสอีกครั้งโดยใช้การกำหนดค่าเริ่มต้นใหม่
mvn jasypt:upgrade -Djasypt.encryptor.password=EXAMPLE
คุณยังสามารถส่งผ่านคุณสมบัติระบบ -Djasypt.plugin.old.major-version
เพื่อระบุเวอร์ชันที่คุณกำลังอัพเกรดได้ นี่จะเป็นค่าเริ่มต้นเป็นเวอร์ชันหลักล่าสุดที่การกำหนดค่ามีการเปลี่ยนแปลง ปัจจุบัน เวอร์ชันหลักเพียงเวอร์ชันเดียวที่เปลี่ยนค่าเริ่มต้นคือเวอร์ชัน 2 ดังนั้นจึงไม่จำเป็นต้องตั้งค่าคุณสมบัตินี้ แต่จะพร้อมใช้งานในอนาคต
คุณยังสามารถถอดรหัสไฟล์คุณสมบัติและโหลดคุณสมบัติทั้งหมดลงในหน่วยความจำและทำให้ Maven สามารถเข้าถึงได้ สิ่งนี้มีประโยชน์เมื่อคุณต้องการทำให้คุณสมบัติที่เข้ารหัสพร้อมใช้งานสำหรับปลั๊กอิน Maven อื่นๆ
คุณสามารถเชื่อมโยงเป้าหมายของปลั๊กอินรุ่นหลังได้โดยตรงหลังจากปลั๊กอินนี้ ตัวอย่างเช่น ด้วยทางบิน:
mvn jasypt:load flyway:migrate -Djasypt.encryptor.password= " the password "
คุณยังสามารถระบุคำนำหน้าสำหรับแต่ละคุณสมบัติด้วย -Djasypt.plugin.keyPrefix=example.
- ซึ่งจะช่วยหลีกเลี่ยงการปะทะที่อาจเกิดขึ้นกับคุณสมบัติ Maven อื่นๆ
สำหรับยูทิลิตี้ข้างต้นทั้งหมด เส้นทางของไฟล์ที่คุณกำลังเข้ารหัส/ถอดรหัสเป็นค่าเริ่มต้นไปที่ file:src/main/resources/application.properties
สิ่งนี้สามารถเปลี่ยนแปลงได้โดยใช้คุณสมบัติระบบ -Djasypt.plugin.path
คุณสามารถเข้ารหัสไฟล์ในไดเร็กทอรีทรัพยากรทดสอบของคุณได้:
mvn jasypt:encrypt -Djasypt.plugin.path= " file:src/main/test/application.properties " -Djasypt.encryptor.password= " the password "
หรือชื่ออื่น:
mvn jasypt:encrypt -Djasypt.plugin.path= " file:src/main/resources/flyway.properties " -Djasypt.encryptor.password= " the password "
หรือมีไฟล์ประเภทอื่น (ปลั๊กอินรองรับรูปแบบไฟล์ข้อความล้วนรวมถึง YAML):
mvn jasypt:encrypt -Djasypt.plugin.path= " file:src/main/resources/application.yaml " -Djasypt.encryptor.password= " the password "
โปรดทราบว่าเป้าหมายการโหลดรองรับเฉพาะไฟล์ .property เท่านั้น
คุณสามารถแทนที่การกำหนดค่าสปริงใดๆ ที่คุณสนับสนุนในแอปพลิเคชันของคุณเมื่อเรียกใช้ปลั๊กอินได้ เช่น การเลือกโปรไฟล์สปริงที่กำหนด:
mvn jasypt:encrypt -Dspring.profiles.active=cloud -Djasypt.encryptor.password= " the password "
หากต้องการเข้ารหัส/ถอดรหัสคุณสมบัติในโครงการหลายโมดูล ให้ปิดใช้งานการเรียกซ้ำด้วย -N
หรือ --non-recursive
บนคำสั่ง 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
แนะนำคุณสมบัติใหม่ในการเข้ารหัส/ถอดรหัสคุณสมบัติโดยใช้การเข้ารหัสแบบอสมมาตรด้วยคู่คีย์ส่วนตัว/สาธารณะในรูปแบบ DER หรือ PEM
ต่อไปนี้เป็นคุณสมบัติการกำหนดค่าที่คุณสามารถใช้เพื่อกำหนดค่าการถอดรหัสคุณสมบัติแบบไม่สมมาตร
สำคัญ | ค่าเริ่มต้น | คำอธิบาย |
jasypt.encryptor.privateKeyString | โมฆะ | รหัสส่วนตัวสำหรับการถอดรหัสในรูปแบบสตริง |
jasypt.encryptor.privateKeyLocation | โมฆะ | ตำแหน่งของคีย์ส่วนตัวสำหรับการถอดรหัสในรูปแบบทรัพยากรสปริง |
jasypt.encryptor.privateKeyFormat | เดอร์ | รูปแบบที่สำคัญ DER หรือ PEM |
คุณควรใช้ privateKeyString
หรือ privateKeyLocation
รูปแบบ String จะมีความสำคัญกว่าหากตั้งค่าไว้ หากต้องการระบุคีย์ส่วนตัวในรูปแบบ DER ด้วย privateKeyString
โปรดเข้ารหัสไบต์ของคีย์เป็น base64
โปรดทราบ ว่า jasypt.encryptor.password
ยังคงมีความสำคัญเหนือกว่าสำหรับการเข้ารหัส PBE มากกว่าการกำหนดค่าแบบไม่สมมาตร
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
ไม่มีโปรแกรม/คำสั่งในการเข้ารหัสคุณสมบัติโดยใช้คีย์แบบอสมมาตร แต่คุณสามารถใช้ข้อมูลโค้ดต่อไปนี้เพื่อเข้ารหัสคุณสมบัติของคุณได้:
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 );
}
}
ตั้งแต่เวอร์ชัน 3.0.5 รองรับการเข้ารหัส AES 256-GCM หากต้องการใช้การเข้ารหัสประเภทนี้ ให้ตั้งค่าคุณสมบัติ jasypt.encryptor.gcm-secret-key-string
, jasypt.encryptor.gcm-secret-key-location
หรือ jasypt.encryptor.gcm-secret-key-password
อัลกอริทึมพื้นฐานที่ใช้คือ AES/GCM/NoPadding
ดังนั้นตรวจสอบให้แน่ใจว่าได้ติดตั้งไว้ใน JDK ของคุณแล้ว
SimpleGCMByteEncryptor
ใช้ IVGenerator
เพื่อเข้ารหัสคุณสมบัติ คุณสามารถกำหนดค่านั้นด้วยคุณสมบัติ jasypt.encryptor.iv-generator-classname
หากคุณไม่ต้องการใช้การใช้งานเริ่มต้น RandomIvGenerator
เมื่อใช้คีย์ผ่าน jasypt.encryptor.gcm-secret-key-string
หรือ jasypt.encryptor.gcm-secret-key-location
ตรวจสอบให้แน่ใจว่าคุณเข้ารหัสคีย์ของคุณใน base64 ค่าสตริง base64 สามารถตั้งค่าเป็น jasypt.encryptor.gcm-secret-key-string
หรือเพียงแค่บันทึกลงในไฟล์และใช้ตัวระบุทรัพยากรสปริงกับไฟล์นั้นในคุณสมบัติ jasypt.encryptor.gcm-secret-key-location
ตัวอย่างเช่น:
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
คุณสามารถสร้าง StringEncryptor
bean ของคุณเองได้:
@ Bean ( "encryptorBean" )
public StringEncryptor stringEncryptor () {
SimpleGCMConfig config = new SimpleGCMConfig ();
config . setSecretKey ( "PNG5egJcwiBrd+E8go1tb9PdPvuRSmLSV3jjXBmWlIU=" );
return new SimpleGCMStringEncryptor ( config );
}
หรือคุณสามารถใช้รหัสผ่านเพื่อเข้ารหัส/ถอดรหัสคุณสมบัติโดยใช้ AES 256-GCM รหัสผ่านใช้เพื่อสร้างคีย์เมื่อเริ่มต้นระบบ ดังนั้นจึงมีคุณสมบัติบางอย่างที่คุณต้อง/สามารถตั้งค่าได้ ได้แก่:
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 "
ตรวจสอบให้แน่ใจว่าพารามิเตอร์นี้เหมือนกันหากคุณเข้ารหัสข้อมูลลับด้วยเครื่องมือภายนอก คุณสามารถสร้าง StringEncryptor
bean ของคุณเองได้:
@ 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 );
}
คุณสามารถใช้ปลั๊กอิน Maven หรือปฏิบัติตามกลยุทธ์ที่คล้ายกันตามที่อธิบายไว้ในคุณสมบัติการเข้ารหัสของ Asymmetric Encryption
repo jasypt-spring-boot-demo-samples มีตัวอย่างแอป Spring Boot ที่ใช้งานได้ แอปสาธิต jasypt-spring-boot-demo หลักจะตั้งค่าคุณสมบัติระบบอย่างชัดเจนด้วยรหัสผ่านการเข้ารหัสก่อนที่แอปจะทำงาน เพื่อให้สถานการณ์สมจริงยิ่งขึ้นอีกเล็กน้อย ให้ลองลบบรรทัดที่ตั้งค่าคุณสมบัติของระบบออก สร้างแอปด้วย maven และรัน:
java -jar target/jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar --jasypt.encryptor.password=password
และคุณจะส่งรหัสผ่านการเข้ารหัสเป็นอาร์กิวเมนต์บรรทัดคำสั่ง เรียกใช้ดังนี้:
java -Djasypt.encryptor.password=password -jar target/jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar
และคุณจะส่งรหัสผ่านการเข้ารหัสเป็นคุณสมบัติของระบบ
หากคุณต้องการส่งคุณสมบัตินี้เป็นตัวแปรสภาพแวดล้อม คุณสามารถทำได้โดยสร้าง application.properties หรือ application.yml แล้วเพิ่ม:
jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD:}
หรือใน YAML
jasypt:
encryptor:
password: ${JASYPT_ENCRYPTOR_PASSWORD:}
โดยพื้นฐานแล้วสิ่งนี้ทำคือการกำหนดคุณสมบัติ jasypt.encryptor.password
ที่ชี้ไปยังคุณสมบัติอื่น JASYPT_ENCRYPTOR_PASSWORD
ที่คุณสามารถตั้งค่าด้วยตัวแปรสภาพแวดล้อมและคุณยังสามารถแทนที่ผ่านคุณสมบัติของระบบได้อีกด้วย เทคนิคนี้ยังสามารถใช้เพื่อแปลชื่อ/ค่าคุณสมบัติสำหรับไลบรารีอื่นๆ ที่คุณต้องการ นอกจากนี้ยังมีให้บริการในแอปสาธิตด้วย ดังนั้นคุณจึงสามารถเรียกใช้แอปสาธิตได้ดังนี้:
JASYPT_ENCRYPTOR_PASSWORD=password java -jar target/jasypt-spring-boot-demo-1.5-SNAPSHOT.jar
หมายเหตุ: เมื่อใช้ Gradle เป็นเครื่องมือสร้าง งาน processResources จะล้มเหลวเนื่องจากอักขระ '$' เพื่อแก้ปัญหานี้ คุณเพียงแค่ต้องกำหนดตัวแปรนี้ให้เป็น '$'
แม้ว่า jasypt-spring-boot-demo จะเป็น Demo ที่ครอบคลุมซึ่งนำเสนอวิธีที่เป็นไปได้ทั้งหมดในการเข้ารหัส/ถอดรหัสคุณสมบัติ แต่ก็มี Demos อื่นๆ หลายตัวที่สาธิตสถานการณ์ที่แยกออกมา