SSMは、mysqlデータベースアカウントのパスワード暗号文ログイン機能を実装します。

SSMは、mysqlデータベースアカウントのパスワード暗号文ログイン機能を実装します。

導入

当社は、情報セキュリティと機密アプリケーションに関わるいくつかのプロジェクトの研究開発に従事しており、それは3つのステップに分かれています。一般的な企業や一般的なプロジェクトと比較して、情報セキュリティに対する要件はより厳格です。リーダーは、データ量とユーザーのユーザー名とパスワード情報を暗号文で設定して保存することを要求しています。これには、jdbc.propertiesファイル内のデータベースのユーザー名とパスワードが含まれます。同じことが当てはまります。暗号文を設定してから、プレーンテキストとしてロードして復号化し、データベースに接続する必要があります。以下は、3つのステップに分かれた実装プロセスです。

1. DESUtilクラスを作成する

カスタム キー、暗号化および復号化の方法を提供します。

パッケージ com.hzdy.DCAD.common.util;
sun.misc.BASE64Decoder をインポートします。
sun.misc.BASE64Encoder をインポートします。
javax.crypto.Cipher をインポートします。
javax.crypto.KeyGenerator をインポートします。
java.security.Key をインポートします。
java.security.SecureRandom をインポートします。
/**
 * 2019/8/8にWongyによって作成されました。
 */
パブリッククラスDESUtil {
  プライベート静的キー key;
  //独自のキーprivate static String KEY_STR = "mykey";
  静的{
    試す {
      KeyGenerator ジェネレータ = KeyGenerator.getInstance("DES");
      セキュアランダム secureRandom = SecureRandom.getInstance("SHA1PRNG");
      セキュアなRandom.setSeed(KEY_STR.getBytes());
      ジェネレーターを初期化します(セキュアランダム);
      キー = ジェネレーター.generateKey();
      ジェネレータ = null;
    } キャッチ (例外 e) {
      新しい RuntimeException(e) をスローします。
    }
  }
  /**
   * 文字列を暗号化し、BASE64 で暗号化された文字列を返します*
   * @param 文字列
   * @戻る
   * @see [クラス、クラス#メソッド、クラス#メンバー]
   */
  パブリック静的文字列 getEncryptString(文字列 str) {
    BASE64Encoder base64Encoder = 新しい BASE64Encoder();
    試す {
      byte[] strBytes = str.getBytes("UTF-8");
      暗号 cipher = Cipher.getInstance("DES");
      cipher.init(Cipher.ENCRYPT_MODE、キー);
      byte[] encryptStrBytes = cipher.doFinal(strBytes);
      base64Encoder.encode(encryptStrBytes) を返します。
    } キャッチ (例外 e) {
      新しい RuntimeException(e) をスローします。
    }
  }
  /**
   * BASE64で暗号化された文字列を復号化する *
   */
  パブリック静的文字列 getDecryptString(文字列 str) {
    BASE64Decoder base64Decoder = 新しい BASE64Decoder();
    試す {
      byte[] strBytes = base64Decoder.decodeBuffer(str);
      暗号 cipher = Cipher.getInstance("DES");
      cipher.init(Cipher.DECRYPT_MODE、キー);
      byte[] encryptStrBytes = cipher.doFinal(strBytes);
      新しい文字列(encryptStrBytes、"UTF-8")を返します。
    } キャッチ (例外 e) {
      新しい RuntimeException(e) をスローします。
    }
  }
  パブリック静的voidメイン(String[] args) {
    文字列名 = "dbuser";
    文字列パスワード = "waction2016";
    文字列 encryname = getEncryptString(name);
    文字列 encrypassword = getEncryptString(password);
    System.out.println("暗号化名:" + 暗号化名);
    System.out.println("encrypassword: " + encrypassword);
    System.out.println("name : " + getDecryptString(encryname));
    System.out.println("パスワード: " + getDecryptString(encrypassword));
  }
}

2. EncryptPropertyPlaceholderConfigurerクラスを作成する

プロファイルとの関連付けを作成します。

パッケージ com.hzdy.DCAD.common.util;
org.springframework.beans.factory.config.PropertyPlaceholderConfigurer をインポートします。
パブリッククラスEncryptPropertyPlaceholderConfigurerはPropertyPlaceholderConfigurerを拡張します{
  //プロパティは構成ファイルのキーと一致している必要があります private String[] encryptPropNames = {"jdbc.username", "jdbc.password"};
  @オーバーライド
  保護された文字列 convertProperty(文字列 propertyName, 文字列 propertyValue) {
    //プロパティが暗号化されたプロパティのリストに見つかった場合 if (isEncryptProp(propertyName)) {
      文字列 decryptValue = DESUtil.getDecryptString(propertyValue);
      System.out.println(値を復号化します);
      decryptValue を返します。
    } それ以外 {
      プロパティ値を返します。
    }
  }
  プライベートブール値isEncryptProp(文字列プロパティ名) {
    (文字列encryptName:encryptPropNames) {
      if (encryptName.equals(propertyName)) {
        true を返します。
      }
    }
    false を返します。
  }
}

3. 設定ファイルjdbc.propertiesを変更する

#設定を暗号化する前に#jdbc.driver=com.mysql.jdbc.Driver
#jdbc.user=ルート
#jdbc.password=ルート
#jdbc.url=jdbc:mysql://localhost:3306/bookstore
#暗号化設定後 jdbc.driver=com.mysql.jdbc.Driver
jdbc.user=Ov4j7fKiCzY=
jdbc.パスワード=Ov4j7fKiCzY=
jdbc.url=jdbc:mysql://localhost:3306/bookstore

4. spring-content.xml設定ファイルを変更する

spring-context の <context:property-placeholder location="classpath:.properties" /> を変更します。
 <bean class="com.hzdy.DCAD.common.util.EncryptPropertyPlaceholderConfigurer"p:locations="classpath:*.properties"/> に変更します。
 //設定ファイルを読み取るBeanは1つだけであることに注意してください。そうでない場合、システムは最初のBeanのみを読み取ります。

注: 暗号文で設定されたusernamepassword正常に読み込まれ、復号化できるが、最終的な接続は依然として暗号文で接続され、エラーが報告される場合は、メモリのプリロードの問題が関係している可能性があります。プロジェクトが開始されると、プログラムは暗号文のユーザー名とパスワードを暗号化します。最終的に復号化が成功したとしても、データベースへの最終的な接続は依然として暗号文で読み込まれます。このとき、接続プールメソッドを自分で書き換え、 spring-content.xmlに書き換えた接続プールメソッドをロードさせ、接続時に事前に復号化することができます。

パッケージ com.thinkgem.jeesite.common.encrypt;
java.sql.Connection をインポートします。
java.sql.SQLException をインポートします。
java.util.Properties をインポートします。
javax.security.auth.callback.PasswordCallback をインポートします。
com.alibaba.druid.util.DruidPasswordCallback をインポートします。
/**
 */
@SuppressWarnings("シリアル")
パブリッククラス DruidDataSource は com.alibaba.druid.pool.DruidDataSource を拡張します {
  パブリックPhysicalConnectionInfo createPhysicalConnection()はSQLExceptionをスローします{
    文字列 url = this.getUrl();
    プロパティ connectProperties = getConnectProperties();
    文字列ユーザー;
    getUserCallback() が null の場合
      ユーザー = getUserCallback().getName();
    } それ以外 {
      ユーザー = getUsername();
    }
    //DES 復号化 user = DESUtils.getDecryptString(user);
    文字列パスワード = DESUtils.getDecryptString(getPassword());
    パスワードコールバック passwordCallback = getPasswordCallback();
    パスワードコールバックが null の場合
      if (passwordCallback インスタンス DruidPasswordCallback) {
        DruidPasswordCallback druidPasswordCallback = (DruidPasswordCallback) passwordCallback;
        druidPasswordCallback.setUrl(url);
        druidPasswordCallback.setProperties(connectProperties);
      }
      char[] chars = passwordCallback.getPassword();
      if (chars != null) {
        パスワード = 新しい文字列(文字)
      }
    }
    プロパティ physicalConnectProperties = new Properties();
    connectProperties が null の場合
      物理接続プロパティを putAll(接続プロパティ) に設定します。
    }
    (user != null && user.length() != 0) の場合 {
      物理接続プロパティを設定します。
    }
    パスワードが null の場合、password.length() は 0 になります。
      physicalConnectProperties.put("パスワード", パスワード);
    }
    接続 conn;
    長い connectStartNanos = System.nanoTime();
    長い connectedNanos、initedNanos、validatedNanos;
    試す {
      conn = createPhysicalConnection(url、physicalConnectProperties);
      接続されたNanos = System.nanoTime();
      (接続 == null)の場合{
        新しい SQLException をスローします ("接続エラー、url " + url + "、driverClass " + this.driverClass);
      }
      物理接続を初期化します(conn);
      initedNanos = System.nanoTime();
      接続を検証します(conn);
      検証されたNanos = System.nanoTime();
      エラーを設定します(null);
    } キャッチ (SQLException ex) {
      エラーセットを作成します(ex);
      投げる例;
    } キャッチ (RuntimeException ex) {
      エラーセットを作成します(ex);
      投げる例;
    } catch (エラー例) {
      エラーカウントを増加して取得します。
      投げる例;
    ついに
      長いnano = System.nanoTime() - connectStartNanos;
      ナノを作成します。
    }
    新しい PhysicalConnectionInfo(conn、connectStartNanos、connectedNanos、initedNanos、validatedNanos) を返します。
  }
}

spring-content.xmlファイルのデータベース接続番号構成を変更します。

#変更前<!-- <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> -->
#変更後 <bean id="dataSource"class="com.thinkgem.jeesite.common.encrypt.DruidDataSource" 
    init-method="init" destroy-method="close">
    <!-- データ ソース ドライバー クラスは省略できます。Druid はデフォルトで URL に基づいて DriverClass を自動的に識別します -->
    <プロパティ名="driverClassName" 値="${jdbc.driver}" />
    <!-- 基本属性 url、user、password -->
    <プロパティ名="url" 値="${jdbc.url}" />
    <プロパティ名="ユーザー名" 値="${jdbc.username}" />
    <プロパティ名="パスワード" 値="${jdbc.password}" />

  </bean>

この時点で、データベース暗号テキスト構成の接続は完了です。

要約する

上記は、MySQL データベース アカウントとパスワードの暗号文ログイン機能を実現するために私が紹介した SSM です。お役に立てれば幸いです。ご質問がある場合は、メッセージを残してください。すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

以下もご興味があるかもしれません:
  • SQL Server Free Edition をインストールし、SQL Server Management Studio (SSMS) を使用してデータベースに接続する方法
  • SQL Server Management Studio (SSMS) でデータベースをコピーする方法
  • SSMフレームワークは写真をアップロードし、ローカルとデータベースの例に保存します
  • SSM フレームワークで log4j と slf4j を組み合わせてログを印刷する方法の詳細な説明
  • SSM プロジェクトで LOG4J ログを構成する方法
  • SSM統合におけるLog4jログの構成の詳細
  • SSMフレームワークがログ情報をデータベースに保存するプロセスの詳細な説明

<<:  Vue で動的に読み込まれたローカル画像を処理する方法

>>:  Dockerfile を使用して Docker イメージをカスタマイズする方法

推薦する

Nginx で limit_req_zone を使用して同じ IP へのアクセスを制限する方法

Nginx は、ngx_http_limit_req_module モジュールの limit_req...

HTML は CSS スタイルと JS スクリプトを動的に読み込みます。例

1. スクリプトを動的に読み込むウェブサイトの需要が高まるにつれて、スクリプトの需要も徐々に増加しま...

JavaScriptのアンチシェイクとスロットリングとは

目次1. 関数デバウンス1. 画像安定化とは何ですか? 2. 関数のスロットリング2.1 タイマーの...

MySQL データベースのインストールと Navicat for MySQL の使用に関するチュートリアル

MySQL は、スウェーデンの会社 MySQL AB によって開発され、現在は Oracle が所有...

Linux でタイムアウト付きの接続関数を試す

前回の記事では、Windows でタイムアウトを試してみました。この記事では、Linux で試してみ...

レスポンシブウェブデザインを実現するためにIEでCSS3メディアクエリをサポートする

今日の画面解像度は、320 ピクセル (iPhone) ほど小さいものから、2560 ピクセル以上 ...

Navicat が MySQL にリモート接続するときに発生する 10060 不明エラーを解決する方法

はじめに:今日は、サーバー上のMySQLにリモート接続したいと思います。使用するソフトウェアはNav...

無料のパブリック STUN サーバー

無料のパブリック STUN サーバーSIP 端末がプライベート IP アドレスを使用する場合、スタン...

MySQL で数千万のテストデータを含むテストデータベースを作成する方法

場合によっては、MySQL が公式に提供しているテスト ライブラリに基づいてテスト データを作成し、...

MySQL 8.0.21 のインストールと設定方法のグラフィックチュートリアル

MySQL 8.0.21のインストールと設定方法を記録してみんなで共有します。 1. ダウンロード1...

HTMLテーブルレイアウトの実践的な使い方の詳しい説明

テーブルはいつ使用されますか?最近では、Web ページの全体的なレイアウトにテーブルが使用されること...

js の parseInt() の奇妙な動作の調査と修正

背景: parseInt(0.006) または parseInt(0.0006) は 0 という値を...

Webページ作成の質問: 画像ファイルのパス

この記事は 123WORDPRESS.COM Lightning によるオリジナルです。転載する際に...

CSS 擬似要素::マーカーの詳細な説明

この記事では、CSS ::markerの興味深い疑似要素を紹介します。これを使用すると、テキスト番号...

secure_file_priv nullの問題を解決する

secure_file_priv = ' ';管理者としてcmdを実行します。 my...