Ver-/Entschlüsselung in Java

Hallo,

ich möchte eine kleine Java-Applikation schreiben, die einen Benutzernamen und ein Passwort erfordert. Beides soll in einer Datenbank gespeichert werden. Der Benutzername kann von mir aus da ruhig im Klartext drinstehen, aber das Passwort sollte irgendwie verschlüsselt werden.

Leider kenne ich mich damit so gut wie gar nicht aus. Kennt jemand einen Artikel, der sich mit der Verschlüsselung von Text/Strings in Java beschäftigt?

Wenn ich das verschlüsselte Passwort in der Datenbank speichere, dann muss ich doch auch den dazugehörenden Schlüssel mitspeichern sonst kann man das Passwort doch nie wieder mit dem beim Login eingegebenen vergleichen, oder?

Wäre Euch sehr für Hilfe dankbar.

Gruß, Robert

java.awt.TextField hat eine Methode setEchoChar(char), dannn sieht der Benutzer nur noch das Zeichen, was angesetzt ist. In der DB wird die Zeichenkette in klaren Texte gespeichert. Mit einem BenutzerID in der DB kann man sie wieder ausfinden und vergleichen.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Es gibt im package sun.misc zwei Klassen, die deinen Anforderungen erfüllen sollten.

Hier ein Beispiel zum Verschlüsseln; Du übergibst z. B. den Wert „gast“ und erhältst den verschlüsselten Wert „Z2FzdA==“ zurück.

public static String encodeString(String p_sString)
{
if(p_sString==null)
return „“;

return (new sun.misc.BASE64Encoder()).encode(p_sString.getBytes());
}

Und hier die Entschlüsselung; Du übergibst „Z2FzdA==“ und erhältst „gast“ zurück:

public static String decodeString(String p_sString)
{
if(p_sString==null || p_sString.equals(""))
return null;

try
{
return new String((new sun.misc.BASE64Decoder()).decodeBuffer(p_sString));
}
catch(IOException e)
{
return null;
}
}

Während der Benutzer immer den Klartext eingibt, greifst du auf die Datenbank mit dem verschlüsselten Wert zu.

Ich hoffe das passt so :smile:

Hubert

1 Like

Hallo,

Es gibt im package sun.misc zwei Klassen, die deinen
Anforderungen erfüllen sollten.
[…]
Ich hoffe das passt so :smile:

Das gibt doch glatt ein Sternchen :wink:

Gruß, Robert

Das gibt doch glatt ein Sternchen :wink:

Den Stern solltest du gleich wieder entziehen. Die genannte Möglichkeit bietet null Sicherheit. Es handelt sich nicht um Verschlüsselung sondern um Codierung. Die base64 Codierung lässt sich wie selbst drauf hingewiesen leicht wieder rückgängig machen => es macht keinen wesentlichen Unterschied ob du die Daten im Klartext oder in base64 abspeicherst, ausser dass sie ned sofort lesbar sind, kann sie jeder entschlüsseln und zwar mit Aufwand null.

„Sichere“ Methoden gibt es, indem du das Passwort durch eine Funktion jagst, die daraus eine Zeichenkette generiert (hashwert oder sowas). Dies macht z.b. MD5 (suche bei google nach MD5 und java findet sicher irgendwas, weiss ned ob das im JDK enthalten ist). Diese Zeichenkette ist NICHT entschlüsselbar. Checken ob das Passwort richtig ist, kannst du indem du das eingegebene Passwort ebenfalls durch MD5 jagst und dann mit dem gespeicherten Wert vergleichst.

Wichtig: Du wirst nie mehr (ohne erheblichen Rechneraufwand) an das Originalpasswort rankommen. Aber das ist auch gut so, weil sonst wäre es nicht sicher.

Grüße
Bruno

1 Like

Wenn es sich um eine MySQL Datenbank handelt kannst Du das Passwort mit hilfe der Funktion PASSWORD() reinschreiben und verschlüsseln. Für genaue Syntax einfach mal google suchen lassen.

Gruß Bonkers

Die gängige Lösung für dein Problem ist das Password mit einem irreversiblen aber eindeutigen Algorithmus zu verschlüsseln (einen Hash bilden) und es dann in der Datenbank zu speichern.

Wenn ein User dann ein Passwort eingibt, wird nicht das gespeicherte Passwort entschlüsselt (was ja nicht möglich ist, da der Algorithmus nur in eine Richtung funktioniert) sondern das eingegebene Passwort verschlüsselt, also wiederum ein Hash davon gebildet, und dann werden die beiden Hash verglichen.

Einen Artikel zu genau deinem Problem findest du unter:
http://developer.java.sun.com/developer/qow/archive/28/

Grüße, Robert