導入 当社は、情報セキュリティと機密アプリケーションに関わるいくつかのプロジェクトの研究開発に従事しており、それは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のみを読み取ります。 注: 暗号文で設定された パッケージ 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 ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。 以下もご興味があるかもしれません:
|
<<: Vue で動的に読み込まれたローカル画像を処理する方法
>>: Dockerfile を使用して Docker イメージをカスタマイズする方法
以前は、ほとんどすべての Web サイトに、すべてのページをリストしたサイトマップ ページがありまし...
この記事では、例を使用して MySQL ユーザーと権限の管理について説明します。ご参考までに、詳細は...
目次序文:成し遂げる:要約:まず効果を見てみましょう: 序文:このアイデアは、Bilibili のア...
成果を達成する 実装コードhtml <h1 class="text-light&qu...
1. setUp関数の最初のパラメータpropsセットアップ(プロパティ、コンテキスト){}最初のパ...
1 背景最近、Shimo Document のオンライン ビジネスでパフォーマンスの問題が発生しまし...
JavaScript厳密モードが 8 進数をサポートしていないという問題に関して、まず、 Java...
目次CentOS7をインストールする静的IPの設定viを使用してファイルを編集するCentOS7をイ...
まだ rem フレキシブルレイアウトを使用していますか?圧縮された js コードの大きなセクションを...
nginx.conf を構成するときには常に何らかの問題が発生します。ここでは、よくある問題とその解...
テスト用の MySQL ライブラリのセット。以前使用されていたバージョンは、centos6 のデフォ...
概要:ファイルシステム モジュールは、標準の POSIX ファイル I/O 操作セットをラップしたシ...
Redux はシンプルな状態マネージャーです。その歴史をたどることはしません。使用法の観点から見ると...
MQTT プロトコルMQTT (Message Queuing Telemetry Transpo...
tomcat の web.xml を構成する場合、サーブレットは比較的重要な問題です。ここでは、サー...