23

エンコードされたパスワードを下記のspringApplicationContext.xmlに保持したい

これを達成する方法はありますか?

現在、以下に示すようにproperty-placeholderを使用してすべてのプロパティを構成しましたが、生のパスワードはまだdatabase.propertiesで開いています。

springApplicationContext.xml

<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <beans:property name="driverClassName"><beans:value>${db.driverClassName}</beans:value></beans:property>
        <beans:property name="url"><beans:value>${db.url}</beans:value></beans:property>
        <beans:property name="username"><beans:value>${db.username}</beans:value></beans:property>
        <beans:property name="password"><beans:value>${db.password}</beans:value></beans:property>
</beans:bean>

しかし、実際の値は私の中に存在しますdatabase.properties

db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/myDB
db.username=root
db.password=root

私は以下のようなものが欲しいです:

springApplicationContext.xml(上記と同じ)

<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <beans:property name="driverClassName"><beans:value>${db.driverClassName}</beans:value></beans:property>
        <beans:property name="url"><beans:value>${db.url}</beans:value></beans:property>
        <beans:property name="username"><beans:value>${db.username}</beans:value></beans:property>
        <beans:property name="password"><beans:value>${db.password}</beans:value></beans:property>
</beans:bean>

しかし、パスワードのプロパティ値は、私の場合は暗号化された形式である必要がありますdatabase.properties

db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/myDB
db.username=root
db.password=3g6n72ef8x (using any encription method).

そして私のdataSourceは、新しいDB接続を確立する前にパスワードを内部的に復号化します。

これに関する助け/提案を高く評価します。

4

5 に答える 5

20

私が自分の質問に答えているのは面白いかもしれません。しかし、それでも私は自分の解決策を伝えたかっただけです。同じ種類の問題に直面した可能性のある他の人たち。

簡単にするために、BASE64EncoderとBASE64Decoderを使用しました。後で、安全でより優れた暗号化/復号化アルゴリズムを使用するようにコードを変更します。

以下のコードを使用して、データベースのパスワード(例:私の場合はroot)をエンコードしました。

private String encode(String str) {
        BASE64Encoder encoder = new BASE64Encoder();
        str = new String(encoder.encodeBuffer(str.getBytes()));
        return str;
    }

エンコードされたパスワードを次のようにdatabase.propertiesファイルに配置します。

db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/myDB
db.username=root
db.password=root

db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/myDB
db.username=root
db.password=cm9vdA==  (Note: encoded 'root' by using BASE64Encoder)

これで、org.apache.commons.dbcp.BasicDataSourceのラッパークラスを作成し、setPassword()メソッドをオーバーライドしました。

import java.io.IOException;
import org.apache.commons.dbcp.BasicDataSource;
import sun.misc.BASE64Decoder;

public class MyCustomBasicDataSource extends BasicDataSource{

    public CustomBasicDataSource() {
        super();
    }

    public synchronized void setPassword(String encodedPassword){
        this.password = decode(encodedPassword);
    }

    private String decode(String password) {
        BASE64Decoder decoder = new BASE64Decoder();
        String decodedPassword = null;
        try {
            decodedPassword = new String(decoder.decodeBuffer(password));
        } catch (IOException e) {
            e.printStackTrace();
        }       
        return decodedPassword;
    }
}

このようにして、database.propertiesで提供されているエンコードされたパスワードをデコード(BASE64Decoder)しています

また、springApplicationContext.xmlファイルに記載されているdataSourceBeanのクラス属性を変更しました。

<beans:bean id="dataSource" class="edu.config.db.datasource.custom.MyCustomBasicDataSource" destroy-method="close">
    <beans:property name="driverClassName"><beans:value>${db.driverClassName}</beans:value></beans:property>
    <beans:property name="url"><beans:value>${db.url}</beans:value></beans:property>
    <beans:property name="username"><beans:value>${db.username}</beans:value></beans:property>
    <beans:property name="password"><beans:value>${db.password}</beans:value></beans:property>

ありがとう。

于 2012-10-11T12:22:48.543 に答える
10

SpringPropertyPlaceHolderConfigurerを拡張するカスタマイズされたPropertyPlaceHolderConfigurerを作成し ます

public class PropertyPlaceholderConfigurer extends
        org.springframework.beans.factory.config.PropertyPlaceholderConfigurer {

    @Override
    protected String convertPropertyValue(final String originalValue) {
        if (originalValue.startwith("SomeText:")) {
            //Apply the decryption logic
            ...
        }
    }
}

プロパティを暗号化して、SomeTextを追加できます。このカスタマイズされたPropertyPlaceHolderConfigurerを使用して、プロパティをロードします

于 2012-10-11T12:27:09.883 に答える
4

ここで全体像を見てみたいと思います。プロパティファイルの値を暗号化するのはなぜですか?許可されていない人があなたのプロパティファイルにアクセスするシナリオは何ですか?

本番クレデンシャルを保存するというこの大きな問題に対処するための通常の手法は、クレデンシャルをソースコードの一部ではなく、環境の一部にすることです。これを行ういくつかの方法があります:

  • プロパティファイル(プレーンテキストのパスワードを含む)を本番環境のWebサーバーのクラスパスに配置します。このように、そのパスワードへのアクセスは、本番環境のマシンへのアクセスによって制御されます。
  • プロパティをweb.xml(context-paramとparam-name)に保存します。このファイルも、コードを実行する環境の一部であり、コードとともに配布されません。このファイルへのアクセスは、マシンへのアクセスによって制御されます。
  • JNDIを使用して、アプリケーションサーバーでそのリソースを構成します。
于 2012-10-11T19:01:05.507 に答える
3

Datasourceメソッド呼び出しを基になるデータソースに委任するが、そうする前にパスワードを復号化するインターフェースを実装するラッパークラスを作成します。

于 2012-10-11T07:50:04.093 に答える
0

データソースとしてTomcat接続プールを使用している場合、ここに実装があります

http://www.jdev.it/encrypting-passwords-in-tomcat/

org.apache.tomcat.jdbc.pool.DataSourceFactoryを拡張するクラスを作成し、server.xmlで構成します。

アップデート:

新しい方法は、Jasyptを使用することです:http ://www.jasypt.org/encrypting-texts.html

于 2014-08-14T06:33:20.400 に答える