私はSpringフレームワークに非常に新しく、データベース接続などを管理するためにSpringフレームワークを使用しています。アプリケーションは、プロパティファイルから私のdb接続パラメーターを読み取ります。必要なのは、接続パスワードを暗号化してプロパティファイルに保存することです。これが私のデータソースxmlファイルです
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>file:${DBConfigFile}</value>
</property>
</bean>
<bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="initialPoolSize"><value>3</value></property>
<property name="minPoolSize"><value>3</value></property>
<property name="maxPoolSize"><value>50</value></property>
<property name="idleConnectionTestPeriod"><value>200</value></property>
<property name="acquireIncrement"><value>1</value></property>
<property name="maxStatements"><value>0</value></property>
<property name="numHelperThreads"><value>3</value></property>
</bean>
</beans>
暗号化されたパスワードをプロパティファイルに書き込むことを考えており、Springがアルゴリズムを使用してパスワードを自動的に復号化できるかどうか疑問に思っています。構成で可能ですか?前もって感謝します。
私の知る限り、Springはこの機能をサポートしていませんが、他のプロジェクトが役立つ場合があります。
Jasyptライブラリ は、暗号化されたアプリケーション構成のサポートを提供します(また、Springと統合します)。詳細を見る: http://www.jasypt.org/encrypting-configuration.html
OWASP Project は、アプリケーションで使用できる EncryptedPropertiesDefaultEncryptedProperties および ReferenceEncryptedProperties 実装とのインターフェースを提供します。参照: https://www.owasp.org/index.php/How_to_encrypt_a_properties_file
Spring 4とjasypt 1.9を使用しています。 Jasyptドキュメントは、Spring 4の明示的なサポートを提供していません。org.jasypt:jasypt:1.9.2
依存関係があるEncryptablePropertyPlaceholderConfigurer
という名前のクラスも見つかりませんでした。
簡単な静的暗号化ユーティリティJavaクラス(これはjasypt APIを使用))を書きました。
public class EncryptionUtil {
static PooledPBEStringEncryptor encryptor = null;
static {
encryptor = new PooledPBEStringEncryptor();
encryptor.setPoolSize(4);
// There are various approaches to pull this configuration via system level properties.
encryptor.setPassword("parashar");
encryptor.setAlgorithm("PBEWITHMD5ANDDES");
}
public static String encrypt(String input) {
return encryptor.encrypt(input);
}
public static String decrypt(String encryptedMessage) {
return encryptor.decrypt(encryptedMessage);
}
}
このユーティリティを使用して、プロパティファイルに保存するつもりのパスワードを暗号化しました。
次に、単にスプリングELを使用して、プロパティを復号化してスプリング構成XMLに戻しました。
<property name="password" value="#{T(amit.parashar.EncryptionUtil).decrypt('${db.password}')}" />
編集:暗号化パスワードを隠す方法について答えるには:
Use system args while bringing up your Java process.
例えば:Java -Dwhatismyencpawd = "parashar"
そしてそれを
encryptor.setPassword(Java.lang.System.getProperty("whatismyencpawd"));
この方法では、アプリ管理者だけがパスワードを知っています。この方法では、パスワードはUNIXボックス上ではpsコマンドの一部として表示されます。
またはOSレベルの環境変数を設定して読み取ることもできます。
暗号化と復号化 を使用できます= Spring Cloud Configによって提供されます
スプリングがそれを解読できれば、他の人も解読できるので意味がありません。この暗号化は何の違いもありません、それは何も保護しません。それは危険なこと、つまり誤った保護感を与えるだけです。
たぶん、データベース認証の別の方法を使用できます。 MS SQLサーバーでは、パスワード認証の代わりにWindowsセキュリティを使用できます。 Postgresでも同じです(ユーザーアカウントまたはSSL証明書を使用してアクセスできます)。
パスワードを復号化するBeanを作成して、パスワードを必要とするものにBeanを注入することができます