2012-06-19 10 views
13

Ich erstelle eine Anwendung und ich muss eine Verbindung zu einer Datenbank herstellen. Die Datenbank benötigt Login/Passwort, damit die Anwendung Operationen wie Auswählen und Einfügen ausführen kann.Wie stelle ich eine Verbindung zu einer Datenbank her, die ein Passwort erfordert, ohne das Passwort freizulegen?

In der Anwendung muss ich mit der Datenbank verbinden mit Login und Passwort, so dass die Anwendung frei ist, einige Aufgaben auf der Datenbank zu tun. Meine Frage ist: Wie kann ich ein Passwort speichern und verwenden, um eine Verbindung zur Datenbank herzustellen, ohne das Passwort freizulegen?

Ich kann nicht einfach einen Hash oder eine Verschlüsselung verwenden, um das Passwort zu speichern, weil die Datenbank das Passwort erkennen muss (ich denke, die meisten oder alle Datenbanken müssen ein Passwort als Klartext erhalten).

.

.

Hinweis: Die Verbindung wird von der Anwendung hergestellt. Keine menschliche Eingabe für die Verbindung.

(Bearbeiten) Weitere Informationen über die Anwendung: Es ist eine Webanwendung mit Servlets/Jsp. Die Datenbank befindet sich auf demselben Server der Anwendung. Der Benutzer für die Anwendung ist ein Standardbenutzer ohne vollständige Administratorbefugnisse, aber er kann Zeilen einfügen/löschen und die meisten Dinge ausführen, die Abfragen und Datenänderungen in Tabellen betreffen.

+0

Können Sie beim Start der Anwendung einen Bediener nach einem Kennwort fragen? – sarnold

+0

Die Verbindung wird von der Anwendung hergestellt. Keine menschliche Eingabe. – ceklock

+3

Ich denke, Sie müssen ein wenig mehr über die Umgebung Ihrer Anwendung beschreiben. Ist dies eine Server-App, Client-App, ist die Datenbank auf dem gleichen Server, anderen Server? Haben Sie einen Benutzer mit Berechtigungen erstellt, die nur eingefügt werden können? (Sie versuchen nicht, sich als root einzuloggen, oder?) Im Allgemeinen müssen Sie "einige Informationen weitergeben" und den Login-Zugang auf einen IP-Bereich beschränken. –

Antwort

10

Der übliche Weg ist, den Benutzernamen/das Passwort zu einer property/config file zu externalisieren, die zur Laufzeit gelesen wird (ob Sie native JDBC/JNDI/CDI/J2EE Datenquelle/etc verwenden oder nicht).

Die Datei wird von den Systemadministratoren über die O/S-Sicherheit geschützt.

Die O/S hat bessere Werkzeuge zum Schutz als App-Code.

+1

Wie kann ich auf diese Datei zugreifen? Ist es verschlüsselt? Muss die Passwörter entschlüsseln? Wie gebe ich das Passwort an die Datenbankverbindung weiter? – ceklock

+0

nicht sicher, wie das in Client-Apps sicher ist (wo das Passwort auf dem Draht ist)? Achten Sie darauf, zu elborieren .... –

+1

Wenn Sie verhindern wollen, dass jemand über Ihre Schulter schauen und das Passwort sehen, wenn Sie die Konfigurationsdatei bearbeiten, können Sie den ['stringScrambler'] (https://github.com/kentcdodds/ Java-Hilfsprogramm/blob/master/src/com/kentcdodds/javahelper/helper/OtherHelper.java # L66) in der Java Helper Library. Es ist wirklich einfach, aber sehr effektiv, um zu verhindern, dass Leute Ihr Passwort auf der Schulter sehen ... – kentcdodds

4

Wenn es sich um eine Webanwendung handelt, stellen Sie sie auf einem Java EE-Anwendungsserver bereit und stellen Sie eine Verbindung mithilfe einer JNDI-Ressource her. Nur der Administrator, der die JNDI-Datenressource eingerichtet hat, muss über die für die Verbindung erforderlichen Anmeldeinformationen informiert sein. Benutzer und Entwickler müssen sie nicht einmal kennen; nur der JNDI-Lookup-Name.

Es ist nicht möglich, den Benutzernamen und das Kennwort für jemanden außer dem Datenbankbesitzer vollständig zu entfernen. Es ist jedoch möglich, dieses Wissen auf den Besitzer des Anwendungsservers zu beschränken.

Sie sind auch gut beraten, separate Anmeldeinformationen nur für diese Anwendung zu erstellen und GRANT es den minimalen Zugriff und die Berechtigungen, die benötigt werden, um seine Aufgaben zu erfüllen. Es sollte keine Kenntnis von Systemtabellen oder anderen Ressourcen außerhalb des Anwendungsbereichs geben. Wenn die Berechtigung DELETE nicht erforderlich ist, erteilen Sie sie nicht. Wenn der Zugriff nur gelesen werden soll, müssen Sie diese Berechtigung erteilen.

6

Sie können jasypt für die Verschlüsselung verwenden. Speichern Sie den Benutzernamen und das Kennwort in der Datei datasource.properties.

public Connection getConnection() throws IOException{ 
    try{ 
     BasicTextEncryptor encryptor = new BasicTextEncryptor(); 
     encryptor.setPassword("jasypt"); 

     Properties props = new EncryptableProperties(encryptor); 
     props.load(this.getClass().getResourceAsStream("datasource.properties")); 

     String driver = props.getProperty("datasource.driver"); 
     String url = props.getProperty("datasource.url");   
     String userName = props.getProperty("datasource.userName");   
     String password = props.getProperty("datasource.password"); 

     Class.forName(driver); 
     Connection conn = DriverManager.getConnection(url, userName, password); 
     conn.setAutoCommit(false); 

     return conn; 
    } catch(ClassNotFoundException e) { 
     e.printStackTrace(); 
     return null; 

    } catch(SQLException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 
+0

Gut zu wissen jasypt Bibliothek. Wissen Sie, ob der Verschlüsselungs-/Entschlüsselungsprozess sicher ist? Ich würde zuerst alle verschlüsselten Passwörter, die ich brauche, in einer Datei speichern und dann versuchen, die Passwörter zu entschlüsseln (Entschlüsselung ist das Problem, weil ich denke, dass ich ein anderes Passwort brauchen würde ...). Aber es scheint, dass Sie nichts mit dieser Bibliothek entschlüsseln müssen. Wenn es funktioniert, ist es sehr gut. – ceklock

+0

Jasypt bietet unidirektionale und bidirektionale Verschlüsselungstechniken. Ich habe gerade die Bibliothek für die Verbindungszeichenfolge verwendet. http://www.jasypt.org/features.html –

7

Sie sollten eine Konfigurationsdatei dafür verwenden. Verwenden Sie den Frühling mit JDBC, um Ihr Leben zu erleichtern!

http://www.youtube.com/watch?v=f-k823MZ02Q

Kasse die oben genial Tutorial auf der Spring-Framework und mit JDBC. Sehen Sie sich alle seine JDBC- und Spring-Tutorials an. BTW, er behandelt, wie Passwörter in Config-Dateien und Draht Bohnen usw. gespeichert werden. Hoffe das hilft.

+0

Dies sind eine großartige Reihe von Tutorials, aber die eine verlinkte behandelt nicht die Passwort-Handhabung. – dwjohnston

Verwandte Themen