2015-02-23 4 views
5

Ich habe Twin-Bcrypt JavaScript-Bibliothek untersucht und eine seltsame Sache gefunden. In einem Moment habe ich mein eigenes Salz auf Serverseite mit PHP base64_encode(openssl_random_pseudo_bytes(16)) gemacht und es in TwinBcrypt.hash() Funktion verwendet, die geantwortet hat, dass Salz wegen der regelmäßigen Musterungleichheit in der Bibliothek ungültig ist. So ist das Muster:JS Twin-Bcrypt Salzmuster

var SALT_PATTERN = /^\$2[ay]\$(0[4-9]|[12][0-9]|3[01])\$[.\/A-Za-z0-9]{21}[.Oeu]/; 

und es sieht gut aus für mein Salz, außer eine Sache - was zum Teufel ist das - [.Oeu]?

Meine erste Frage ist, warum sie von Salz erwartet mit einem Punkt oder O oder e oder u zu beenden? Soweit ich weiß openssl_random_pseudo_bytes() erzeugt sichere CSPRNG, aber wegen der Muster JS-Bibliothek will es nicht akzeptieren.

Zweite Frage - gibt es einen Sicherheitsgrund, damit das Salz mit /[.Oeu]/ Muster endet?

Ich wäre sehr dankbar für jede Hilfe, denn es gibt nicht viele Informationen darüber.

Antwort

4

Ich weiß nicht wirklich gut bcrypt, aber es scheint, dass Twin-Bcrypt erwartet die salt Parameter den vollständigen Typ-Tag (2a/2y/2x), Kostenparameter, und tatsächliche Verschlüsselungs Salz Wert enthalten. (Ich glaube, dass dies getan wird, um die Erwartungen anderer Bibliotheken zu erfüllen.) Der kryptographische Salt-Wert ist nur die letzten 22 Zeichen der salt Parameter-Zeichenfolge, die einen 128-Bit-Wert darstellen.

Um tatsächlich Ihr Problem zu lösen, müssen Sie zwei Dinge tun:

  1. Präfix Ihr Salz mit $2y$10$ so, dass es einen Art-Tag und einen Kostenparameter hat.

  2. Ordnen Sie Ihr PHP-Ergebnis base64_encode den nicht standardmäßigen base64-Werten von bcrypt zu. Als Referenz sind die Werte:

    Standard: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/ 
    bcrypt: ./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
    

    Wenn Sie einfach einen Standard base64 in eine brcypt-Base64-String machen möchten, können Sie alle + mit . ersetzen kann, aber das in einem anderen Wert führen wird (weil Standard + ist ein 62, während . ist ein 0, und alle anderen Werte sind auch versetzt). Wenn Sie eine Brypt-Zeichenfolge mit demselben Wert wie das Original verwenden möchten, müssen Sie jedes Zeichen durch das entsprechende bcrypt-Zeichen ersetzen.

    Möglicherweise müssen Sie auch die nachstehende = aus der Standardzeichenfolge entfernen, falls vorhanden.


Zusätzliche Informationen: Warum muss das Salz mit [.Oeu] enden?

Ein Salz in bcrypt ist 128 Bits. Jedes base64-Zeichen kommuniziert 6 Informationsbits.Das bedeutet, dass 21 base64-Zeichen 126 Bits gleichmäßig übertragen können. Die letzten 2 Bits müssen in einem abschließenden 22. Zeichen codiert sein. Da dieses Zeichen nur aus 2 Bits besteht, kann es nur 4 mögliche Werte haben.

Wenn wir den base64 Charakter Pool für brypt untersuchen, sehen wir:

./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

Zählen von Null an, wir sehen, dass diese Werte bei indicies erscheinen:

. => 0 = 000000 
O => 16 = 010000 
e => 32 = 100000 
u => 48 = 110000 

Also diese beiden letzten Bits sind Setzen der High-End-Bits des letzten Zeichens.

+0

Dies sollte zu Wiki hinzugefügt werden. Ich danke dir sehr! – Nevertheless