Warum enden so viele gehashte und verschlüsselte Zeichenfolgen in einem Gleichheitszeichen?

64

Ich arbeite in C # und MSSQL und wie zu erwarten, speichere ich meine Passwörter gesalzen und gehasht.

Wenn ich mir den in einer nvarchar-Spalte gespeicherten Hash ansehe (zum Beispiel den out the box aspnet-Mitgliedschaftsanbieter). Ich war schon immer neugierig, warum die generierten Salt- und Hash-Werte immer mit ein oder zwei Gleichheitszeichen enden.

Ich habe ähnliche Dinge bei der Arbeit mit Verschlüsselungsalgorithmen gesehen. Ist dies ein Zufall oder gibt es einen Grund dafür?

Liath
quelle
19
Wenn Sie Base64-codierte Binärdaten in einem NVARCHAR-Feld speichern, weine ich übrigens um Ihren 6-fachen Speichermüll! Zum einen kann Base64 nur 64 der Zeichen in der unteren Hälfte von ASCII enthalten (Sie brauchen also nur VARCHAR, um die Hälfte zu speichern). Für zwei explodiert Base64 jedes Datenbyte in 1-4 Zeichen. SQL Server hat bereits einen VARBINARY-Typ, der durchaus in der Lage ist, Ihre Hashes zu speichern, ohne die Codierung zu
beeinträchtigen
3
@ WillieWheeler, der Hash muss irgendwie gespeichert werden. Base64 ist vielleicht nicht das perfekte Speichermedium, aber nichts ist von Natur aus falsch daran. Wenn hash("my password")das Array erzeugt [1,2,3,4,5]und ich brauche diese Werte in einer Datenbank zu speichern, es gibt schlimmere Möglichkeiten als die Zeichenfolge zu speichern AQIDBAU=(Natürlich, wenn die Hash - Funktion in Gebrauch ist bereits eine Reihe produziert, scheint es ein wenig albern dann Base64 kodieren. )
Brian S
2
@ WillieWheeler Ich denke, Sie verpassen den Punkt. Lesen Sie noch einmal, was Brian S geschrieben hat - er hat nicht über die Eigenschaften von base64 für das Hashing gesprochen -, das wäre absurd base64 ist kein Hashing-Algorithmus. Er sagt, dass es nichts Falsches gibt, einen Hash (der von einer Hash-Funktion / einem Hash-Algorithmus erzeugt wurde) in base64-Form zu speichern.
Andrew Savinykh
3
Das OP sagt, dass er den Hash speichert und er mit Gleichheitszeichen endet. Das deutet darauf hin, dass er Hashing mit Base64-Codierung verwechselt. Wenn der Punkt ist, dass es in Ordnung ist, einen Hash mit base64 zu kodieren, dann natürlich, aber was hat das mit irgendetwas zu tun?
Willie Wheeler
2
Ja, ich habe endlich gemerkt, was los ist. Ich habe in meinen öffentlichen und privaten SSH-Schlüsseldateien nachgesehen und festgestellt, dass sie auch die Endungen = / == haben. Dies sind Base64-Codierungen von Byte-Arrays, wie sie von BrianS und zespri beschrieben werden. Danke Leute.
Willie Wheeler

Antworten:

95

Diese gehashten Zeichenfolgen werden (normalerweise?) Im Base64-Format codiert, und das Gleichheitszeichen wird zum Auffüllen der Zeichenfolge verwendet, um die Länge (Anzahl der Bytes) durch drei teilbar zu machen. Wikipedia erklärt es ziemlich gut: http://en.wikipedia.org/wiki/Base64 .

Svenslaggare
quelle
36

Könnte es Base 64-Codierungsauffüllung sein?

Die Sequenz '==' gibt an, dass die letzte Gruppe nur ein Byte enthielt, und '=' gibt an, dass sie zwei Bytes enthielt. Das folgende Beispiel zeigt, wie das Abschneiden der Eingabe des gesamten obigen Anführungszeichens die Ausgabeauffüllung ändert:

http://en.wikipedia.org/wiki/Base64#Output_padding

Jaydee
quelle