2016-09-26 16 views
-1

私はLaravelの暗号化モジュールと互換性のあるハッシュを作成しようとしています。ここで はLaravelのリファレンス・ソースコードである:ここでhttps://github.com/illuminate/encryption/blob/master/Encrypter.php#L101-163Compatibilty AES-256-CBCノード/ Laravel

は、私が通ってくるきたものである。残念ながら

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); 
}; 

私はそれをしようとするとき、私はBAD_DECRYPTを持っています。これはOpenSSLのパディングから来ているようです。誰にもアイデアはありますか?

+0

注:私はBASE64_ENCODEを持っていると私は、私はPHPの機能をシリアル化し、他のしていることに注意するのを忘れphpjsや他のもの – Extaze

答えて

1

これは動作するはずです:

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); 
}; 

を問題:

  • openssl_encryptは、自動的にPKCS#7パディングとのNode.jsは、あまりにも、ありません使用しています。
  • 複数のBase64文字列を連結して1つのBase64エンコード文字列を作成しても、2つの文字列の最初にパディング文字(=)が含まれている可能性があります。それらのいくつかはダミービットです。これがBase64の仕組みです。 hereを見られるよう

PHPのserizalizeはJavaScriptに移植することができます。

+0

から機能ユーティリティをシリアル化。私はあなたの解決策をできるだけ早く試してみます – Extaze

+0

それはすごくうまくいきます。唯一のことは 'Buffer.concat([value、cipher.final()])' – Extaze

+0

ありがとうございます!私は実際に私が答えで書くものを実際に試していない、そして今はお尻で私を噛まれている;) –