web-dev-qa-db-ja.com

Springのプロパティファイルに暗号化されたパスワードを保存する方法

私は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がアルゴリズムを使用してパスワードを自動的に復号化できるかどうか疑問に思っています。構成で可能ですか?前もって感謝します。

16
tace

私の知る限り、Springはこの機能をサポートしていませんが、他のプロジェクトが役立つ場合があります。

7
Slava Semushin

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レベルの環境変数を設定して読み取ることもできます。

6
Amit Parashar

暗号化と復号化 を使用できます= Spring Cloud Configによって提供されます

1
Shahbour

スプリングがそれを解読できれば、他の人も解読できるので意味がありません。この暗号化は何の違いもありません、それは何も保護しません。それは危険なこと、つまり誤った保護感を与えるだけです。

たぶん、データベース認証の別の方法を使用できます。 MS SQLサーバーでは、パスワード認証の代わりにWindowsセキュリティを使用できます。 Postgresでも同じです(ユーザーアカウントまたはSSL証明書を使用してアクセスできます)。

1
kan

パスワードを復号化するBeanを作成して、パスワードを必要とするものにBeanを注入することができます

0
icsmith23