Ist eine Base64-codierte Zeichenfolge eindeutig?

9

Ich kann keine Antwort darauf finden. Wenn ich eine Zeichenfolge mit Base64 codiere, wird die codierte Ausgabe basierend auf der Zeichenfolge eindeutig sein? Ich frage, weil ich ein Token erstellen möchte, das Benutzerinformationen enthalten wird, so muss ich sicherstellen, dass die Ausgabe abhängig von den Informationen eindeutig sein wird.

Zum Beispiel, wenn ich "UnqUserId: 987654321 Timestamp: 01/02/03" kodiere, wird dies einzigartig sein, egal, welche andere Benutzer-ID ich dort hineinlege, wird es niemals eine Kollision geben?

    
user2924127 24.05.2015, 22:51
quelle

2 Antworten

20

Zwei Jahre zu spät, aber hier gehen wir:

Die kurze Antwort lautet Ja, eindeutige binäre / hexadezimale Werte werden immer in eine eindeutige base64-codierte Zeichenfolge codiert.

ABER, mehrere base64-codierte Strings können einen einzelnen binären / hexadezimalen Wert darstellen.

Dies liegt daran, dass Hex-Bytes nicht mit Base64-Ziffern ausgerichtet sind. Ein einzelnes hexadezimales Byte wird durch 8 Bits repräsentiert, während eine einzelne base64-Ziffer durch 6 Bits dargestellt wird. Daher kann jeder Hexadezimalwert, der nicht 6-Bit-ausgerichtet ist kann mehrere base64-Darstellungen haben (obwohl korrekt implementierte base64-Encoder sollten für die gleiche base64-Darstellung kodieren).

Ein Beispiel für diese Fehlausrichtung ist der Hexadezimalwert '0x433356c1'. Dieser Wert wird durch 32-Bit und Base64 codiert in 'QzNWwQ =='. Dieser 32-Bit-Wert ist jedoch nicht 6-Bit-ausgerichtet. Was passiert also? Der Base64-Codierer puffert in diesem Fall vier Null-Bits an das Ende der binären Darstellung, um die Folge 36-Bit und folglich 6-Bit ausgerichtet zu machen.

Beim Decodieren muss der base64-Decoder nun in einen 8-Bit-Alignment-Wert dekodieren. Er schneidet die aufgefüllten Bits ab und dekodiert die ersten 32 Bits in einen Hexadezimalwert. Zum Beispiel sind 'QzNWwc ==' und 'QzNWwQ ==' verschiedene base64-codierte Strings, aber sie dekodieren den gleichen hexadezimalen Wert, 0x433356c1. Wenn wir genau hinschauen, bemerken wir, dass die ersten 32 Bits für beide dieser codierten Strings identisch sind:

%Vor%

Der einzige Unterschied besteht in den letzten vier Bits, die ignoriert werden. Beachten Sie, dass kein base64-Encoder jemals oder irgendeinen anderen base64-Wert für 0x433356c1 anders als 'QzNWwQ ==' erzeugen sollte, da hinzugefügte Füllbytes immer Nullen sein sollten.

Zusammenfassend kann davon ausgegangen werden, dass ein eindeutiger binärer / hex-Wert immer unter Verwendung korrekt implementierter base64-Codierer zu einer eindeutigen base64-Darstellung codiert. Eine 'Kollision' wird nur während der Dekodierung auftreten, wenn Base64-Strings generiert werden, ohne dass Füll- / Ausrichtungsbytes auf Null gesetzt werden.

    
seano 06.10.2017, 02:31
quelle
7

Es ist eine Kodierung, keine Verschlüsselung. Da Sie die Zeichenfolge dekodieren können, muss sie eindeutig sein.

    
Antoine Comeau 24.05.2015 22:54
quelle

Tags und Links