SSM implementiert die Chiffretext-Anmeldefunktion für das Kennwort des MySQL-Datenbankkontos

SSM implementiert die Chiffretext-Anmeldefunktion für das Kennwort des MySQL-Datenbankkontos

Einführung

Unser Unternehmen ist an der Forschung und Entwicklung einiger Projekte beteiligt, die Informationssicherheit und vertrauliche Anwendungen betreffen. Diese sind in drei Schritte unterteilt. Im Vergleich zu allgemeinen Unternehmen und allgemeinen Projekten sind die Anforderungen an die Informationssicherheit strenger. Die Führungskräfte verlangen, dass das Datenvolumen sowie die Benutzernamen- und Kennwortinformationen des Benutzers konfiguriert und in verschlüsseltem Text gespeichert werden müssen. Dies betrifft den Benutzernamen und das Kennwort der Datenbank in der Datei jdbc.properties. Das Gleiche gilt. Der verschlüsselte Text muss konfiguriert und dann geladen und als Klartext entschlüsselt werden, um eine Verbindung zur Datenbank herzustellen. Im Folgenden wird der Implementierungsprozess beschrieben, der in drei Schritte unterteilt ist.

1. Erstellen Sie die DESUtil-Klasse

Stellen Sie benutzerdefinierte Schlüssel sowie Verschlüsselungs- und Entschlüsselungsmethoden bereit.

Paket com.hzdy.DCAD.common.util;
importiere sun.misc.BASE64Decoder;
importiere sun.misc.BASE64Encoder;
importiere javax.crypto.Cipher;
importiere javax.crypto.KeyGenerator;
importiere java.security.Key;
importiere java.security.SecureRandom;
/**
 * Erstellt von Wongy am 08.08.2019.
 */
öffentliche Klasse DESUtil {
  privater statischer Schlüssel;
  //Eigener Schlüsselprivate static String KEY_STR = "mykey";
  statisch {
    versuchen {
      KeyGenerator-Generator = KeyGenerator.getInstance("DES");
      SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
      secureRandom.setSeed(KEY_STR.getBytes());
      generator.init(sichererRandom);
      Schlüssel = Generator.GenerateKey();
      Generator = null;
    } Fang (Ausnahme e) {
      neue RuntimeException(e) auslösen;
    }
  }
  /**
   * Verschlüsseln Sie die Zeichenfolge und geben Sie die mit BASE64 verschlüsselte Zeichenfolge zurück*
   * @param str
   * @zurückkehren
   * @see [Klasse, Klassen#Methode, Klassen#Mitglied]
   */
  öffentliche statische Zeichenfolge getEncryptString(String str) {
    BASE64Encoder base64Encoder = neuer BASE64Encoder();
    versuchen {
      byte[] strBytes = str.getBytes("UTF-8");
      Chiffre cipher = Cipher.getInstance("DES");
      cipher.init(Cipher.ENCRYPT_MODE, Schlüssel);
      byte[] encryptStrBytes = cipher.doFinal(strBytes);
      gibt base64Encoder.encode(encryptStrBytes) zurück;
    } Fang (Ausnahme e) {
      neue RuntimeException(e) auslösen;
    }
  }
  /**
   * Entschlüsseln Sie die mit BASE64 verschlüsselte Zeichenfolge *
   */
  öffentliche statische Zeichenfolge getDecryptString(String str) {
    BASE64Decoder base64Decoder = neuer BASE64Decoder();
    versuchen {
      byte[] strBytes = base64Decoder.decodeBuffer(str);
      Chiffre cipher = Cipher.getInstance("DES");
      cipher.init(Cipher.DECRYPT_MODE, Schlüssel);
      byte[] encryptStrBytes = cipher.doFinal(strBytes);
      gib einen neuen String zurück (encryptStrBytes, "UTF-8");
    } Fang (Ausnahme e) {
      neue RuntimeException(e) auslösen;
    }
  }
  öffentliche statische void main(String[] args) {
    Zeichenfolgenname = "dbuser";
    Zeichenfolge „Passwort“ = „waction2016“;
    String-Verschlüsselungsname = getEncryptString(Name);
    String encrypassword = getEncryptString(Passwort);
    System.out.println("Verschlüsselungsname : " + Verschlüsselungsname);
    System.out.println("Verschlüsselungskennwort: " + Verschlüsselungskennwort);
    System.out.println("name : " + getDecryptString(verschlüsselungsname));
    System.out.println("Passwort: " + getDecryptString(encrypassword));
  }
}

2. Erstellen Sie die Klasse EncryptPropertyPlaceholderConfigurer

Erstellen Sie eine Zuordnung zu einem Profil.

Paket com.hzdy.DCAD.common.util;
importiere org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
öffentliche Klasse EncryptPropertyPlaceholderConfigurer erweitert PropertyPlaceholderConfigurer {
  //Die Eigenschaft muss mit dem SCHLÜSSEL der Konfigurationsdatei übereinstimmen private String[] encryptPropNames = {"jdbc.username", "jdbc.password"};
  @Überschreiben
  geschützte String-Konvertierungseigenschaft(String-Eigenschaftsname, String-Eigenschaftswert) {
    //Wenn die Eigenschaft in der Liste der verschlüsselten Eigenschaften gefunden wird if (isEncryptProp(propertyName)) {
      Zeichenfolge decryptValue = DESUtil.getDecryptString(Eigenschaftswert);
      System.out.println(entschlüsselnWert);
      gib den Entschlüsselungswert zurück;
    } anders {
      Eigenschaftswert zurückgeben;
    }
  }
  private boolean isEncryptProp(String Eigenschaftsname) {
    für (String encryptName : encryptPropNames) {
      wenn (Verschlüsselungsname.equals(Eigenschaftsname)) {
        gibt true zurück;
      }
    }
    gibt false zurück;
  }
}

3. Ändern Sie die Konfigurationsdatei jdbc.properties

#Vor dem Verschlüsseln der Konfiguration#jdbc.driver=com.mysql.jdbc.Driver
#jdbc.Benutzer=root
#jdbc.password=root
#jdbc.url=jdbc:mysql://localhost:3306/bookstore
#Nach der Verschlüsselungskonfiguration jdbc.driver=com.mysql.jdbc.Driver
jdbc.Benutzer=Ov4j7fKiCzY=
jdbc.password=Ov4j7fKiCzY=
jdbc.url=jdbc:mysql://localhost:3306/bookstore

4. Ändern Sie die Konfigurationsdatei spring-content.xml

Ändern Sie <context:property-placeholder location="classpath:.properties" /> im Spring-Kontext
 Ändern Sie in <bean class="com.hzdy.DCAD.common.util.EncryptPropertyPlaceholderConfigurer"p:locations="classpath:*.properties"/>
 //Beachten Sie, dass es nur eine Bean geben kann, die die Konfigurationsdatei liest, sonst liest das System nur die erste

Hinweis: Wenn Sie feststellen, dass username und password erfolgreich geladen und entschlüsselt werden können, die endgültige Verbindung jedoch immer noch im Chiffretext hergestellt wird und ein Fehler gemeldet wird, kann dies auf das Problem des Speichervorladens zurückzuführen sein. Sobald das Projekt gestartet ist, verschlüsselt das Programm den Benutzernamen und das Passwort im Chiffretext. Selbst wenn die Entschlüsselung am Ende erfolgreich ist, wird die endgültige Verbindung zur Datenbank immer noch im Chiffretext gelesen. Zu diesem Zeitpunkt können wir die Verbindungspoolmethode selbst neu schreiben, spring-content.xml die neu geschriebene Verbindungspoolmethode laden lassen und sie beim Herstellen der Verbindung im Voraus entschlüsseln.

Paket com.thinkgem.jeesite.common.encrypt;
importiere java.sql.Connection;
importiere java.sql.SQLException;
importiere java.util.Properties;
importiere javax.security.auth.callback.PasswordCallback;
importiere com.alibaba.druid.util.DruidPasswordCallback;
/**
 */
@SuppressWarnings("Seriennummer")
öffentliche Klasse DruidDataSource erweitert com.alibaba.druid.pool.DruidDataSource {
  öffentliche PhysicalConnectionInfo createPhysicalConnection() wirft SQLException {
    Zeichenfolge-URL = this.getUrl();
    Eigenschaften connectProperties = getConnectProperties();
    String-Benutzer;
    if (getUserCallback() != null) {
      Benutzer = getUserCallback().getName();
    } anders {
      Benutzer = getUsername();
    }
    //DES-Entschlüsselung user = DESUtils.getDecryptString(user);
    String-Passwort = DESUtils.getDecryptString(getPassword());
    Passwortrückruf Passwortrückruf = getPasswordCallback();
    if (passwordCallback != null) {
      if (passwordCallback-Instanz von DruidPasswordCallback) {
        DruidPasswordCallback druidPasswordCallback = (DruidPasswordCallback) PasswortCallback;
        druidPasswordCallback.setUrl(url);
        druidPasswordCallback.setProperties(connectProperties);
      }
      char[] chars = passwordCallback.getPassword();
      wenn (Zeichen != null) {
        Passwort = neuer String (Zeichen);
      }
    }
    Eigenschaften physicalConnectProperties = neue Eigenschaften();
    if (connectProperties != null) {
      physicalConnectProperties.putAll(connectProperties);
    }
    if (Benutzer != null && Benutzer.Länge() != 0) {
      physicalConnectProperties.put("Benutzer", Benutzer);
    }
    if (password != null && password.length() != 0) {
      physicalConnectProperties.put("Passwort", Passwort);
    }
    Anschlussanschl.;
    lange connectStartNanos = System.nanoTime();
    lange verbundene Nanos, initiierte Nanos, validierte Nanos;
    versuchen {
      conn = erstellePhysicalConnection(url, physicalConnectProperties);
      connectedNanos = System.nanoTime();
      wenn (conn == null) {
        throw new SQLException("Verbindungsfehler, URL " + URL + ", Treiberklasse " + diese.Treiberklasse);
      }
      initPhysicalConnection(conn);
      initedNanos = System.nanoTime();
      validiereVerbindung(conn);
      validiertNanos = System.nanoTime();
      setCreateError(null);
    } abfangen (SQLException-Beispiel) {
      setCreateError(Beispiel);
      werfen ex;
    } Fang (RuntimeException ex) {
      setCreateError(Beispiel);
      werfen ex;
    } catch (Fehler ex) {
      ErstelleErrorCount.incrementAndGet();
      werfen ex;
    Endlich
      langer Nano = System.nanoTime() - connectStartNanos;
      erstelleTimespan += nano;
    }
    gibt neue PhysicalConnectionInfo zurück (conn, connectStartNanos, connectedNanos, initedNanos, validatedNanos);
  }
}

Ändern Sie die Konfiguration der Datenbankverbindungsnummer der Datei spring-content.xml

#Vor der Änderung<!-- <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> -->
#Nach der Änderung <bean id="dataSource"class="com.thinkgem.jeesite.common.encrypt.DruidDataSource" 
    init-method="init" destroy-method="schließen">
    <!-- Die Treiberklasse der Datenquelle kann weggelassen werden. Druid erkennt die Treiberklasse standardmäßig automatisch anhand der URL -->
    <Eigenschaftsname="TreiberKlassenname" Wert="${jdbc.driver}" />
    <!-- Basisattribute URL, Benutzer, Passwort -->
    <Eigenschaftsname="URL" Wert="${jdbc.url}" />
    <property name="Benutzername" value="${jdbc.username}" />
    <Eigenschaftsname="Passwort" Wert="${jdbc.password}" />

  </bean>

An diesem Punkt ist die Verbindung zur Datenbank-Chiffretextkonfiguration abgeschlossen!

Zusammenfassen

Oben ist das SSM, das ich Ihnen vorgestellt habe, um die MySQL-Datenbankkonto- und Kennwort-Chiffretext-Anmeldefunktion zu realisieren. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und ich werde Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken!
Wenn Sie diesen Artikel hilfreich finden, können Sie ihn gerne abdrucken und dabei bitte die Quelle angeben. Vielen Dank!

Das könnte Sie auch interessieren:
  • So installieren Sie SQL Server Free Edition und stellen mithilfe von SQL Server Management Studio (SSMS) eine Verbindung zur Datenbank her
  • So kopieren Sie eine Datenbank in SQL Server Management Studio (SSMS)
  • Das SSM-Framework lädt Bilder hoch und speichert sie lokal und in Datenbankbeispielen
  • Detaillierte Erläuterung zum Drucken von Protokollen in Kombination mit log4j und slf4j im SSM-Framework
  • So konfigurieren Sie das LOG4J-Protokoll im SSM-Projekt
  • Konfigurationsdetails der Log4j-Protokollierung in der SSM-Integration
  • Detaillierte Erläuterung des Prozesses zum Speichern von Protokollinformationen in der Datenbank durch das SSM-Framework

<<:  So passen Sie Docker-Images mit Dockerfile an

>>:  Node.js erstellt ein einfaches Crawler-Case-Tutorial

Artikel empfehlen

Untersuchung des Problems der Flip-Navigation mit geneigter Maus

In diesem Artikel analysieren wir als Beispiel die...

Docker verwendet Root, um in den Container zu gelangen

Führen Sie zuerst den Docker-Container aus Führen...

Erklären Sie kurz die Verwendung von „group by“ in SQL-Anweisungen

1. Übersicht Gruppieren nach bedeutet, Daten nach...

Detaillierte Erklärung der Kodierungsprobleme bei MySQL-Befehlszeilenoperationen

1. Überprüfen Sie die MySQL-Datenbankkodierung my...

border-radius ist eine Methode zum Hinzufügen abgerundeter Ränder zu Elementen

border-radius:10px; /* Alle Ecken sind mit einem ...

Ausführliches Tutorial zur CentOS-Installation von MySQL5.7

In diesem Artikel werden die detaillierten Schrit...

JavaScript-Dom-Objektoperationen

Inhaltsverzeichnis 1. Kern 1. Holen Sie sich den ...

Einige kleine Methoden, die häufig in HTML-Seiten verwendet werden

Fügen Sie das Tag <Head> hinzu <meta http...

So verwalten Sie Benutzer und Gruppen beim Ausführen von Docker

Docker ist ein Verwaltungstool, das Prozesse als ...

Zwei Tools zum Teilen des Bildschirms im Linux-Befehlszeilenterminal

Hier sind zwei Terminal-Split-Screen-Tools: scree...

Detaillierte Erklärung zur Verwendung von MySQL-Gruppenlinks

Gruppieren und Verknüpfen sind in MySQL die beide...

Einige häufige Fehler mit MySQL null

Laut Nullwerten bedeutet der Wert Null in MySQL l...

ReactRouter-Implementierung

ReactRouter-Implementierung ReactRouter ist die K...

MySQL 5.7.17 Installations- und Konfigurations-Tutorial unter CentOS6.9

CentOS6.9 installiert Mysql5.7 zu Ihrer Informati...