Hier wird das Passwort “123” gehasht. Ich erhalte den Hashwert als Byte-Array.
Was ist nun die übliche Weise, ich ich meinen Hashwert, welcher sich ja derzeit in einem Byte-Array befindet, in die Datenbank speichere?
Den Datentyp Byte-Array gibts ja in (My)SQL nicht. Speichere ich das als String? Falls ja, was genau enthält dieser String dann? Alle zahlen des Byte-Arrays hintereinandergekettet? Wäre das nicht inperformant?
String ist schon richtig. Die Klasse String hat den Kontruktor String(byte[] bytes) sowie die Methode byte[] getBytes() um zwischen byte[] und String umzuschalten.
[quote=Jack159]Den Datentyp Byte-Array gibts ja in (My)SQL nicht.[/quote]Aber den Datentyp BLOB (Binary Large OBject).
[quote=Jack159;80769]Speichere ich das als String?[/quote]Das ist ohne weiteres nicht möglich, weil die Bytes des Hashes nicht zwingend darstellbar Zeichen sind. Es gibt aber ein etabliertes Verfahren um das sicherzustellen (base64). Damit lässt sich der Hash dann als String speichern.
[quote=Jack159;80769]Wäre das nicht inperformant?[/quote]Solange Du nur einzelne Paswörter bearbeitest sollte das nicht spührbar sein. Und wenn Du irgendwann mal viele Passworter auf einmal verarbeiten musst (so mehr als eine Million) können wir uns gerne noch mal über Performanz-Aspekte unterhalten.
Die beste Art, um einen Hash zu speichern, ist der Datentyp CHAR. Für SHA-512 Hashes ist es ein CHAR(128). Gespeichert wird dann die Hexrepräsentation des Hashes, d. h., dass die einzelnen Nibbles jeweils ein ASCII-Zeichen im Bereich 0-f zugeordnet bekommen. Diese Konvertierung ist effizient und auch die Speicherung in CHAR(128) ist in MySQL sehr performant. Fragmentierungsprobleme und zusätzlicher Verwaltungsoverhead fallen dabei nämlich weg.
@cmr
es gibt aber einen deutlichen platz-unterschied zwischen HEX und Base64
bei einer HEX-darstellung brauchst du für 1 byte 2 zeichen, und wenn du das ganze auch noch als CHAR speicherst (16bit) brauchst du um 8bit abzubilden ganze 32bit
das ist speicherverschwedung da 100% overhead
Base64 hingegen ist deutlich “schlanker”, denn hier werden 3 daten-bytes, also 24bit, in 4 code-bytes, also 32bit, abgebildet
der overhead beträgt hier nur noch 33%
gut … wieder andere würden jetzt sicher dagegen argumentieren das Base64 aufwändiger ist (wobei es eigentlich nur bit-geschubse ist > shift-operationen kosten auf modernen cpus nur noch einen zyklus) weil man die code-wörter noch durch die substitutionstabelle laufen lassen muss, würde ich jetzt aber erlich gesagt vom rechenaufwand her aber gleich dem betrachten um von einem binär-wert zwischen 0 und 15 in das entsprechende ASCII-zeichen umzuwandeln
wäre also wirklich nur mikro-optimierung und bei heutigen rechen-monstern zu vernachlässigen
da kann der zusätzliche speicher bei größeren datenbanken schon deutlicher ins gewicht fallen
Wie komme ich nun von passwortHashByte (byte-Array) auf ein Format (String, Zahl oder sonst was übliches), welches ich bedenkenlos in die Db speichern kann? Am besten erstmal die einfachste, aber dennoch akzeptable Weise. Es geht nicht um eine Anwendung, bei der Millionen PW gespeichert werden, ich möchte mir nur eine möglichst einfache/simple, aber dennoch korrekte variante merken ;)
Wenn du die im anderen Thread vorgeschlagene Konvertierung verwendest, dann kommst du genau bei der Codierung heraus, die du in CHAR(128) speichern kannst.
Diese Darstellung ist übrigens auch die Standarddarstellung für einen Hash, den Kommandozeilentools und auch andere Anwendungen ausgeben.
[QUOTE=cmrudolph]Wenn du die im anderen Thread vorgeschlagene Konvertierung verwendest, dann kommst du genau bei der Codierung heraus, die du in CHAR(128) speichern kannst.
Diese Darstellung ist übrigens auch die Standarddarstellung für einen Hash, den Kommandozeilentools und auch andere Anwendungen ausgeben.[/QUOTE]
In dem anderen Thread meinte ich genau solch eine Ausgabe.