2016-09-26 3 views
-1

Ich versuche einen Hash zu erstellen, der mit dem Laravel Verschlüsselungsmodul kompatibel ist. Hier ist die Referenz-Quellcode für Laravel: https://github.com/illuminate/encryption/blob/master/Encrypter.php#L101-163Kompatibilität AES-256-CBC Node/Laravel

Hier ist, was ich bin gekommen, durch:

const encrypt = function (payload) { 
    const iv = crypto.randomBytes(16); 
    const key = new Buffer(config.stuff.key, 'base64'); 

    const cipher = crypto.createCipheriv('aes-256-cbc', key, iv); 
    cipher.setAutoPadding(false); // With or without this /!\ 
    let value = cipher.update(serialize(JSON.stringify(payload)), 'utf8', 'base64'); 

    value + cipher.final('base64'); 

    const mac = crypto.createHmac('sha256', new Buffer(config.stuff.key, 'base64')).update(iv.toString('base64') + value).digest('hex'); 

    const json = JSON.stringify({ iv: iv.toString('base64'), value, mac }); 

    return base64_encode(json); 
}; 

Leider habe ich einen BAD_DECRYPT, wenn ich das versuchen. Dies scheint von OpenSSL Padding zu kommen. Hat jemand eine Idee?

+0

Hinweis: Ich habe base64_encode und serialisieren Funktionen von phpjs und andere Sachen – Extaze

Antwort

1

sollte diese Arbeit:

const encrypt = function (payload) { 
    const iv = crypto.randomBytes(16); 
    const key = new Buffer(config.stuff.key, 'base64'); 

    const cipher = crypto.createCipheriv('aes-256-cbc', key, iv); 
    let value = cipher.update(serialize(payload), 'utf8'); 

    value = Buffer.concat([value, cipher.final()]).toString('base64'); 

    const mac = crypto.createHmac('sha256', key) 
      .update(iv.toString('base64') + value) 
      .digest('hex'); 

    const json = JSON.stringify({ 
     iv: iv.toString('base64'), 
     value: value, 
     mac: mac 
    }); 

    return base64_encode(json); 
}; 

Die Themen:

  • openssl_encrypt tut auch automatisch PKCS # 7-Polsterung und node.js verwendet.
  • Das Verknüpfen mehrerer Base64-Strings zu einem einzelnen Base64-codierten String funktioniert nicht immer, da der erste der beiden Strings Füllzeichen (=) enthalten kann, was bedeutet, dass nicht alle Bits des vorherigen Zeichens tatsächlich zum Chiffretext gehören. Einige von ihnen sind nur Dummy-Bits. So funktioniert Base64.

PHP serizalize kann JavaScript portiert werden als here gesehen.

+0

Ich habe vergessen zu beachten, dass ich serialize und andere PHP-Funktionen haben. Ich werde versuchen, Ihre Lösung so schnell wie möglich – Extaze

+0

Das funktioniert, super. Die einzige Sache ist, dass es 'Buffer.concat ist ([Wert, cipher.final()])' – Extaze

+0

Danke! Ich versuche eigentlich nicht, was ich in Antworten schreibe und jetzt hat es mich in den Arsch gebissen;) –