2016-09-26 92 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和從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字符串以形成單個Base64編碼的字符串並不總是有效,因爲兩個字符串中的第一個字符串可能包含填充字符(=),這意味着前一個字符的所有位實際上都不屬於密文。其中一些只是虛擬位。這就是Base64的工作原理。

PHP的serizalize可以如圖here被移植到JavaScript的。

+0

我忘了注意,我有序列化和其他PHP函數。我會盡快嘗試你的解決方案 – Extaze

+0

工作,真棒。唯一的是它是'Buffer.concat([value,cipher.final()])' – Extaze

+0

謝謝!我通常不會真正嘗試我寫的答案,現在它已經把我咬在屁股上;) –