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 イメージをカスタマイズする方法

推薦する

サイトマップをウェブページの下部に配置するメリットと例

以前は、ほとんどすべての Web サイトに、すべてのページをリストしたサイトマップ ページがありまし...

MySQLユーザーと権限管理の詳細な説明

この記事では、例を使用して MySQL ユーザーと権限の管理について説明します。ご参考までに、詳細は...

HTML+CSSで充電水滴融合特殊効果コードを実現

目次序文:成し遂げる:要約:まず効果を見てみましょう: 序文:このアイデアは、Bilibili のア...

CSS3 で作成された背景グラデーションアニメーション効果

成果を達成する 実装コードhtml <h1 class="text-light&qu...

Vue3 の SetUp 関数のプロパティとコンテキスト パラメータの詳細な説明

1. setUp関数の最初のパラメータpropsセットアップ(プロパティ、コンテキスト){}最初のパ...

MySQLの不合理なMaxIdleConnsにより接続が短くなる

1 背景最近、Shimo Document のオンライン ビジネスでパフォーマンスの問題が発生しまし...

JavaScriptの厳密モードが8進数をサポートしていない問題の説明

JavaScript厳密モードが 8 進数をサポートしていないという問題に関して、まず、 Java...

Mac VMware Fusion CentOS7 静的 IP 構成チュートリアル図

目次CentOS7をインストールする静的IPの設定viを使用してファイルを編集するCentOS7をイ...

モバイルレイアウトにvw+remを使用する方法

まだ rem フレキシブルレイアウトを使用していますか?圧縮された js コードの大きなセクションを...

nginx.conf のルートディレクトリ設定の詳細な説明

nginx.conf を構成するときには常に何らかの問題が発生します。ここでは、よくある問題とその解...

MySQL innodb例外の修復に関する経験の共有

テスト用の MySQL ライブラリのセット。以前使用されていたバージョンは、centos6 のデフォ...

Node.js の fs モジュールと Path モジュールのメソッドの詳細な説明

概要:ファイルシステム モジュールは、標準の POSIX ファイル I/O 操作セットをラップしたシ...

react+reduxを使用してカウンター機能を実装すると発生する問題

Redux はシンプルな状態マネージャーです。その歴史をたどることはしません。使用法の観点から見ると...

Tomcat でサーブレット URL パターンを構成する際の問題の詳細な説明

tomcat の web.xml を構成する場合、サーブレットは比較的重要な問題です。ここでは、サー...