7

Ich habe eine Eigenschaftendatei in Java, in der ich alle Informationen meiner App, wie Logo Bild Dateiname, Datenbankname, Datenbankbenutzer und Datenbankkennwort speichern.
Ich kann das Passwort in der Eigenschaftendatei verschlüsselt speichern.
Aber der Schlüssel oder die Passphrase kann mithilfe eines Decompilers aus dem Jar gelesen werden.
Gibt es eine Möglichkeit, den DB-Durchlauf in einer Eigenschaftendatei sicher zu speichern?Protect Embedded Passwort

Antwort

3

Es gibt mehrere Möglichkeiten, dies zu verwalten. Wenn Sie herausfinden können, wie ein Benutzer beim Starten der Anwendung ein Kennwort für einen Schlüsselspeicher bereitstellen kann, besteht die am besten geeignete Methode darin, alle Werte mithilfe eines Schlüssels zu verschlüsseln und diesen Schlüssel im Schlüsselspeicher zu speichern. Die Befehlszeilenschnittstelle zum Keystore wird mithilfe von keytool hergestellt. JSE verfügt jedoch über APIs, um programmgesteuert auf den Schlüsselspeicher zuzugreifen.

Wenn Sie nicht die Möglichkeit haben, dass ein Benutzer dem Schlüsselspeicher beim Start manuell ein Kennwort gibt (z. B. für eine Webanwendung), besteht eine Möglichkeit darin, eine außergewöhnlich komplexe Verschleierungsroutine zu schreiben, die den Schlüssel verschleiern kann und speichern Sie es auch in einer Eigenschaftendatei. Es ist wichtig zu beachten, dass die Verschleierungs- und Entschleierungslogik mehrschichtig sein sollte (z. B. Verwürfelung, Codierung, Einführung von falschen Zeichen usw.) und selbst mindestens einen Schlüssel haben sollte, der in anderen Klassen in der Anwendung versteckt sein könnte Verwenden nicht intuitiver Namen. Dies ist kein vollkommen sicherer Mechanismus, da jemand mit einem Decompiler und einer angemessenen Menge an Zeit und Intelligenz immer noch daran arbeiten kann, aber der einzige, den ich kenne, der nicht verlangt, dass Sie in nativen (dh nicht leicht dekompilierbaren) Code einbrechen .

1

Nein, gibt es nicht. Selbst wenn Sie es verschlüsseln, wird jemand den Code dekompilieren, der es entschlüsselt.

+0

Wenn Sie jemandem den Schlüssel und das Schloss geben, können sie den Schlüssel duplizieren und auf das Schloss zugreifen, ohne den Schlüssel, den Sie ihm ursprünglich gegeben haben. Wenn Sie den Schlüssel nicht zur Verfügung stellen, können Sie ihn nicht daran hindern. Es ist auch der grundlegende Fehler bei DRM. –

0

Sie könnten eine separate Eigenschaftendatei (außerhalb des JAR) für Passwörter (entweder DB-Passwort oder Schlüsselphrephrase) erstellen und diese Eigenschaftendatei nicht mit der Distribution einschließen. Oder Sie können möglicherweise veranlassen, dass der Server diese Anmeldung nur von einer bestimmten Maschine akzeptiert, sodass ein Spoofing erforderlich wäre.

2

Sie speichern einen SHA1-Hash des Kennworts in Ihrer Eigenschaftendatei. Wenn Sie dann ein Benutzerpasswort validieren, hashen Sie ihren Anmeldeversuch und stellen sicher, dass die beiden Hashes übereinstimmen.

Dies ist der Code, der einige Bytes für Sie hasht. Mit der getBytes()-Methode können Sie Bytes aus einem String auf einfache Weise generieren.

/** 
    * Returns the hash value of the given chars 
    * 
    * Uses the default hash algorithm described above 
    * 
    * @param in 
    *   the byte[] to hash 
    * @return a byte[] of hashed values 
    */ 
    public static byte[] getHashedBytes(byte[] in) 
    { 
     MessageDigest msg; 
     try 
     { 
      msg = MessageDigest.getInstance(hashingAlgorithmUsed); 
     } 
     catch (NoSuchAlgorithmException e) 
     { 
      throw new AssertionError("Someone chose to use a hashing algorithm that doesn't exist. Epic fail, go change it in the Util file. SHA(1) or MD5"); 
     } 
     msg.update(in); 
     return msg.digest(); 
    } 
+0

Gute Antwort, aber nicht auf seine Frage. –

+0

Ich denke, ich verstehe die Frage dann nicht vollständig. – jjnguy

+2

Er möchte den Benutzernamen und das Kennwort speichern, mit denen die Anwendung eine Verbindung zur Datenbank herstellt.Er muss also in der Lage sein, es in den Klartext zurückzuverwandeln, bevor er sich mit der Datenbank verbindet. –

0

Neben die Passwörter verschlüsselt, wie oben beschrieben stellen alle Passwörter in separaten Properties-Datei und beim Entfalten versuchen, diese Datei zu geben, die die meisten gesperrten Berechtigungen möglich.

Wenn Ihr Anwendungsserver beispielsweise unter Linux/Unix als root ausgeführt wird, müssen Sie die Kennworteigenschaftendatei im Besitz von root mit 400/-r-------- Berechtigungen erstellen.

0

Konnte die App nicht über https einen Server kontaktieren und das Passwort herunterladen, nachdem sie sich authentifiziert haben?