MessageDigest von einem char[] berechnen

Status
Nicht offen für weitere Antworten.

Tobias

Top Contributor
Hallo,

wie ihr euch vielleicht denken könnt, plane ich folgendes: Ich will für ein Passwort, das mir über ein JPasswordField gegeben wurde - also sinnvoller Weise als char[] vorliegt, eine SHA-1-Prüfsumme berechnen, die anschließend in die Datenbank wandern wird. Dabei gibt es bloß ein Problem: MessageDigest verlangt byte[] als Parameter, ich hab aber char[] - eine Umwandlung scheint nur über String machbar zu sein. Den Weg über String will ich aber nicht gehen, weil JPasswordField mir das Passwort ja nicht zum Spaß als char[] zurückgibt (Übriggebliebene Passwörter im Speicher und so'n Quatsch).
Wer weiß eine vernünftige Lösung?

mpG
Tobias

P.S.: Derzeitiger Lösungsweg:
Für jeden Character im Array wird ein neuer String angelegt, welcher seine Byte-Werte per update() in den Digester gibt. So ist zumindest die Reihenfolge der Zeichen unklar, wenn das Ursprungsarray erst überschrieben wurde - aber optimal ist das was "Performance" und "Sicherheit" angeht natürlich nicht.
 
Wenn du explizit einen String mit new erzeugst, umgehst du den Stringpool, und der String wird wieder gelöscht...
Wie auch immer kannst du trotzdem nicht sagen wann...
Aber mal im Ernst: Brauchst du wirklich solche Sicherheit?...Ich mein, jemand der auf dein Programm so Zugriff hat, dass er eventuelle Strings aus der Tiefe der VM auslesen kann, der könnte auch einen Trojaner installieren, der die Tastatureingabe direkt einliest..
 
wieso kann man aus einem char nicht direkt ein byte machen?
was macht String was char nicht kann?

und wenn du dir schon diese Einzelumwandlung überlegt hast,
dann mach doch gleich ein statisches Array, sofort das byte (oder mehrere) für jedes Zeichen
 
Es geht mehr um sauberes Design und saubere Implementierung, denn um "brauch ich das wirklich" => Diplomarbeit.

Außerdem mag ich solche Designbrüche einfach nicht (auch wenn ich verstehe, wie sie entstehen), denn was nützt mir die zusätzliche Sicherheit einer JPasswordField-Implementierung, wenn ich daraus nicht mal einen Digest berechnen kann - was ja schließlich ein Standardverfahren für die Ablage von Passwörtern darstellt. Aber gut, wenn mein Vorschlag das Bestmögliche darstellt ...

Danke meez,
Tobias
 
@SlaterB: char zu byte ist eine narrowing conversion, kostet mich als Präzision. Da durchaus Werte, die mit byte nicht mehr darstellbar wären, zu meinem gültigen Wertebereich gehören, kommt das nicht in Frage. String hat ne Methode, die ein byte[] zurückgibt, also keinen Präzisionsverlust verursacht.

Bei den statischen Arrays kann ich dir nicht folgen, bzw wenn ich das selbe denke wie du, ist mir die Lösung zu aufwendig, für jedes Zeichen des Unicodes eine Byte-Folge zu hinterlegen 😉...

mpG
Tobias
 
Wenn du das, was String#getBytes liefert (also die Byte-Repräsentation des Unicode-String unter Verwendung des Default-Encodings) für einzelne Characters brauchst, musst du wohl den CharsetEncoder verwenden.

Code:
		try {
			//--- char-Array mit dem Passwort
			char[] cc = new char[]{ 'p','a','s','s','w','ö','r','d'};

			//--- Default-Encoding
			Charset cs = Charset.defaultCharset();
			CharsetEncoder enc = cs.newEncoder();
		
			//--- Eingangsdaten in CharBuffer kopieren
			CharBuffer cb = CharBuffer.allocate( cc.length);
			cb.put( cc);
			cb.flip();

			//--- Byte-Repraesentation erzeugen
			ByteBuffer bb = enc.encode( cb);
			byte[] ba = bb.array();
			
			//--- decoden nur zum Test
			String testString = new String( ba);
			System.out.println( "decoded: " + testString);
		} catch ( Exception e) {
			e.printStackTrace();
		}
 
was meinst du mit zu aufwendig?
ist doch nur eine Schleife Code, von char 0 bis char 65.500 durchlaufen lassen oder was auch immer du brauchst,

zur Laufzeit hast du dann doch die gleichen Probleme:
entweder durch Einzelstrings oder durch das Array hast du für ein char-Array der Länge 10 zehn einzelne Byte-Arrays,
die du dann zusammenfügen musst,

der Unterschied ist nur, dass das Array sehr sehr viel schneller ist

--------

die allgemeine Abwägung zwischen Berechnung und Caching besteht natürlich immer, das stimmt,
für 12 Passwörter am Tag muss der Speicher nicht mit einem Riesenarray belegt werden
 
@SlaterB: Es geht um ein Programm, das schätzungsweise 10-15 mal am Tag eine Passworteingabe verkraften muss - also Berechnung ist wohl das Mittel der Wahl. Bei der Benutzung von String.getBytes() kann ich einfach digester.update() benutzen, habe also mit dem Zusammenfügen der byte[] direkt nichts zu tun (Auch wenn das natürlich passiert irgendwo).

@Murray: Mh, das sieht interessant aus. Werde ich mir mal näher anschauen ...

mpG und Danke an alle Beteiligten,
Tobias
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben