تكامل Jasypt مع Spring Boot 2.x و3.0.0
يوفر Jasypt Spring Boot دعم التشفير لمصادر الملكية في تطبيقات Spring Boot.
هناك ثلاث طرق لدمج jasypt-spring-boot
في مشروعك:
jasypt-spring-boot-starter
إلى مسار الفصل الخاص بك إذا كان استخدام @SpringBootApplication
أو @EnableAutoConfiguration
سيؤدي إلى تمكين الخصائص القابلة للتشفير عبر بيئة الربيع بأكملهاjasypt-spring-boot
إلى مسار الفصل الخاص بك وإضافة @EnableEncryptableProperties
إلى فئة التكوين الرئيسية الخاصة بك لتمكين الخصائص القابلة للتشفير عبر بيئة الربيع بأكملهاjasypt-spring-boot
إلى مسار الفصل الدراسي الخاص بك والإعلان عن مصادر الملكية الفردية القابلة للتشفير باستخدام @EncrytablePropertySource
استخدم إحدى الطرق الثلاثة التالية (تم شرحها بإيجاز أعلاه):
ما عليك سوى إضافة تبعية جرة البداية إلى مشروعك إذا كان تطبيق Spring Boot الخاص بك يستخدم @SpringBootApplication
أو @EnableAutoConfiguration
وسيتم تمكين الخصائص القابلة للتشفير عبر بيئة Spring بأكملها (وهذا يعني أي خاصية نظام، أو خاصية بيئة، أو وسيطة سطر الأوامر، أو application.properties، أو application) -*.properties وخصائص yaml وأي مصادر خصائص أخرى يمكن أن تحتوي على خصائص مشفرة):
< dependency >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-spring-boot-starter</ artifactId >
< version >3.0.5</ version >
</ dependency >
إذا كنت لا تستخدم التعليقات التوضيحية للتكوين التلقائي @SpringBootApplication
أو @EnableAutoConfiguration
، فقم بإضافة هذه التبعية إلى مشروعك:
< dependency >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-spring-boot</ artifactId >
< version >3.0.5</ version >
</ dependency >
ثم قم بإضافة @EnableEncryptableProperties
إلى فئة التكوين الخاصة بك. على سبيل المثال:
@ Configuration
@ EnableEncryptableProperties
public class MyApplication {
...
}
وسيتم تمكين الخصائص القابلة للتشفير عبر بيئة Spring بأكملها (وهذا يعني أن أي خاصية نظام، وخاصية بيئة، ووسيطة سطر الأوامر، وapplication.properties، وخصائص yaml، وأي مصادر خصائص مخصصة أخرى يمكن أن تحتوي على خصائص مشفرة)
إذا كنت لا تستخدم التعليقات التوضيحية @SpringBootApplication
أو @EnableAutoConfiguration
Auto Configuration ولا ترغب في تمكين الخصائص القابلة للتشفير عبر بيئة Spring بأكملها، فهناك خيار ثالث. قم أولاً بإضافة التبعية التالية إلى مشروعك:
< dependency >
< groupId >com.github.ulisesbocchio</ groupId >
< artifactId >jasypt-spring-boot</ artifactId >
< version >3.0.5</ version >
</ dependency >
ثم قم بإضافة العديد من التعليقات التوضيحية @EncryptablePropertySource
كما تريد في ملفات التكوين الخاصة بك. تمامًا كما تفعل مع التعليق التوضيحي الخاص بـ @PropertySource
. على سبيل المثال:
@ 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، توجد طريقة رابعة لتمكين الخصائص القابلة للتشفير في بعض الحالات الخاصة. يتم توفير فئة ConfigurableEnvironment
المخصصة: EncryptableEnvironment
StandardEncryptableEnvironment
و StandardEncryptableServletEnvironment
التي يمكن استخدامها مع SpringApplicationBuilder
لتحديد البيئة المخصصة بهذه الطريقة:
new SpringApplicationBuilder ()
. environment ( new StandardEncryptableEnvironment ())
. sources ( YourApplicationClass . class ). run ( args );
ستتطلب هذه الطريقة فقط استخدام التبعية لـ jasypt-spring-boot
. ليس هناك حاجة إلى تبعية جرة البداية. هذه الطريقة مفيدة للوصول المبكر إلى الخصائص المشفرة في bootstrap. على الرغم من أنه ليس مطلوبًا في معظم السيناريوهات، فقد يكون مفيدًا عند تخصيص سلوك التمهيد الخاص بـ 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 >
يمكن استخدام هذه الآلية على سبيل المثال (كما هو موضح) لتهيئة مُلحق تسجيل قاعدة البيانات الذي يتطلب تمرير بيانات اعتماد حساسة. بدلاً من ذلك، إذا كانت هناك حاجة إلى توفير StringEncryptor
مخصص، فسيتم توفير طريقة إنشاء ثابتة StandardEncryptableEnvironment#builder
للتخصيص (التخصيصات الأخرى ممكنة):
StandardEncryptableEnvironment
. builder ()
. encryptor ( new MyEncryptor ())
. build ()
سيؤدي هذا إلى تشغيل بعض التكوينات التي سيتم تحميلها والتي تقوم بشكل أساسي بأمرين:
StringEncryptor
الافتراضي الذي يمكن تهيئته من خلال الخصائص العادية أو خصائص النظام أو وسيطات سطر الأوامر. عند استخدام الطريقتين 1 و2، يمكنك تعريف الخصائص المشفرة في أي من مصادر الخصائص الموجودة في البيئة. على سبيل المثال، باستخدام التعليق التوضيحي @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
.
عند استخدام الطريقة الثالثة ( @EncryptablePropertySource
)، يمكنك الوصول إلى الخصائص المشفرة بنفس الطريقة، والفرق الوحيد هو أنه يجب عليك وضع الخصائص في المورد الذي تم الإعلان عنه ضمن التعليق التوضيحي @EncryptablePropertySource
حتى يمكن فك تشفير الخصائص بشكل صحيح.
يستخدم Jasypt StringEncryptor
لفك تشفير الخصائص. بالنسبة لجميع الطرق الثلاثة، إذا لم يتم العثور على StringEncryptor
مخصص (راجع قسم التشفير المخصص للحصول على التفاصيل) في سياق Spring، فسيتم إنشاء واحد تلقائيًا يمكن تهيئته من خلال الخصائص التالية (النظام، ملف الخصائص، وسيطات سطر الأوامر، متغير البيئة، إلخ.):
مفتاح | مطلوب | القيمة الافتراضية |
jasypt.encryptor.password | حقيقي | - |
jasypt.encryptor.algorithm | خطأ شنيع | PBEWITHHMACSHA512ANDAES_256 |
jasypt.encryptor.key-obtention-iterations | خطأ شنيع | 1000 |
jasypt.encryptor.pool-size | خطأ شنيع | 1 |
jasypt.encryptor.provider-name | خطأ شنيع | SunJCE |
jasypt.encryptor.provider-class-name | خطأ شنيع | باطل |
jasypt.encryptor.salt-generator-classname | خطأ شنيع | org.jasypt.salt.RandomSaltGenerator |
jasypt.encryptor.iv-generator-classname | خطأ شنيع | org.jasypt.iv.RandomIvGenerator |
jasypt.encryptor.string-output-type | خطأ شنيع | base64 |
jasypt.encryptor.proxy-property-sources | خطأ شنيع | خطأ شنيع |
jasypt.encryptor.skip-property-sources | خطأ شنيع | قائمة فارغة |
الخاصية الوحيدة المطلوبة هي كلمة مرور التشفير، ويمكن ترك الباقي لاستخدام القيم الافتراضية. في حين أنه يمكن الإعلان عن كل هذه الخصائص في ملف خصائص، إلا أنه لا ينبغي تخزين كلمة مرور التشفير في ملف خاصية، بل يجب بدلاً من ذلك تمريرها كخاصية نظام أو وسيطة سطر أوامر أو متغير بيئة وبقدر ما يكون اسمها jasypt.encryptor.password
سوف تعمل.
الخاصية الأخيرة، jasypt.encryptor.proxyPropertySources
تُستخدم للإشارة إلى jasyp-spring-boot
حول كيفية اعتراض قيم الخاصية لفك التشفير. تستخدم القيمة الافتراضية false
تطبيقات مجمعة مخصصة لـ PropertySource
و EnumerablePropertySource
و MapPropertySource
. عند تحديد true
لهذه الخاصية، ستستخدم آلية الاعتراض وكلاء CGLib في كل تطبيق PropertySource
محدد. قد يكون هذا مفيدًا في بعض السيناريوهات حيث يجب الحفاظ على نوع PropertySource
الأصلي.
بالنسبة للتكوين المخصص للمشفر ومصدر كلمة مرور التشفير، يمكنك دائمًا تحديد وحدة StringEncryptor الخاصة بك في سياق الربيع الخاص بك، وسيتم تجاهل التشفير الافتراضي. على سبيل المثال:
@ 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 ;
}
لاحظ أن اسم الحبة مطلوب، حيث اكتشف jasypt-spring-boot
أدوات String Encyptors المخصصة حسب الاسم اعتبارًا من الإصدار 1.5
. اسم الفول الافتراضي هو:
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
أو إذا كنت تريد تقديم اسم الفول الخاص بك، فتجاوز الخاصية jasypt.encryptor.property.detector-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
أو إذا كنت تريد تقديم اسم الفول الخاص بك، فتجاوز الخاصية jasypt.encryptor.property.resolver-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
ستتوقف عن العمل لأن المحلل الافتراضي هو الذي يستخدمها. سيكون عليك توصيل كل تلك الأشياء بنفسك. لحسن الحظ، لا يتعين عليك تجاوز هذه الحبة في معظم الحالات، فالخيارات السابقة ستكون كافية.
ولكن كما ترون في التنفيذ، فإن اكتشاف وفك تشفير الخصائص المشفرة أمر داخلي في MyEncryptablePropertyResolver
يقدم jasypt-spring-boot:2.1.0
ميزة جديدة لتحديد مرشحات الخصائص. يعد عامل التصفية جزءًا من EncryptablePropertyResolver
API ويسمح لك بتحديد الخصائص أو مصادر الخصائص التي يجب التفكير فيها لفك التشفير. وذلك حتى قبل فحص قيمة الخاصية الفعلية للبحث عنها أو محاولة فك تشفيرها. على سبيل المثال، بشكل افتراضي، يتم استبعاد جميع الخصائص التي يبدأ اسمها بـ jasypt.encryptor
من الفحص. وذلك لتجنب التبعيات الدائرية في وقت التحميل عندما يتم تكوين وحدات المكتبة.
افتراضيًا، يستخدم DefaultPropertyResolver
DefaultPropertyFilter
، والذي يسمح لك بتحديد قوائم أنماط السلسلة التالية:
EncryptablePropertyFilter
مخصص يمكنك تجاوز التنفيذ الافتراضي من خلال توفير Bean من النوع EncryptablePropertyFilter
بالاسم encryptablePropertyFilter
أو إذا كنت تريد تقديم اسم الفول الخاص بك، فتجاوز الخاصية jasypt.encryptor.property.filter-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 = "كلمة المرور".
افتراضيًا، سيأخذ المكون الإضافي بعين الاعتبار تكوين التشفير في ملفات تكوين تمهيد Spring القياسية ضمن ./src/main/resources. يمكنك أيضًا استخدام خصائص النظام أو متغيرات البيئة لتوفير هذا التكوين.
ضع في اعتبارك أن بقية كود تطبيقك وموارده غير متاحة للمكون الإضافي لأن مكونات Maven الإضافية لا تشارك مسار الفصل مع المشاريع. إذا كان تطبيقك يوفر تكوين تشفير عبر وحدة StringEncryptor، فلن يتم التقاط ذلك.
بشكل عام، يوصى بالاعتماد فقط على التكوين الافتراضي الآمن.
لتشفير تشغيل قيمة واحدة:
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
لاحظ أن الإخراج إلى الشاشة، بدلاً من تحرير الملف في مكانه، مصمم لتقليل الالتزام العرضي للقيم التي تم فك تشفيرها للتحكم في الإصدار. عند فك التشفير، فأنت على الأرجح تريد فقط التحقق من القيمة التي تم تشفيرها، بدلاً من الرغبة في فك تشفير تلك القيمة بشكل دائم.
يعد تغيير تكوين الخصائص المشفرة الموجودة أمرًا غريبًا بعض الشيء باستخدام أهداف التشفير/فك التشفير. يجب عليك تشغيل هدف فك التشفير باستخدام التكوين القديم، ثم نسخ الإخراج الذي تم فك تشفيره مرة أخرى إلى الملف الأصلي، ثم تشغيل هدف التشفير باستخدام التكوين الجديد.
يعمل هدف إعادة التشفير على تبسيط ذلك عن طريق إعادة تشفير ملف في مكانه. يجب توفير مجموعتين من التكوين. يتم توفير التكوين الجديد بنفس الطريقة التي تقوم بها بتكوين الأهداف الأخرى. يتم توفير التكوين القديم عبر خصائص النظام مسبوقة بـ "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 | دير | تنسيق المفتاح. دير أو بيم |
يجب عليك إما استخدام privateKeyString
أو privateKeyLocation
، ويكون لتنسيق السلسلة الأولوية إذا تم تعيينه. لتحديد مفتاح خاص بتنسيق 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 ( "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 ( "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 أو اتباع استراتيجية مماثلة كما هو موضح في خصائص التشفير للتشفير غير المتماثل
يحتوي jasypt-spring-boot-demo-samples repo على أمثلة تطبيق Spring Boot العاملة. يقوم تطبيق jasypt-spring-boot-demo 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 هو عرض توضيحي شامل يعرض جميع الطرق الممكنة لتشفير/فك تشفير الخصائص، إلا أن هناك عروضًا توضيحية متعددة أخرى تعرض سيناريوهات معزولة.