gpt4 book ai didi

php - 兼容性 AES-256-CBC Node/Laravel

转载 作者:太空宇宙 更新时间:2023-11-03 15:10:40 25 4
gpt4 key购买 nike

我正在尝试创建一个与 Laravel 的加密模块兼容的散列。这是 Laravel 的引用源代码:https://github.com/illuminate/encryption/blob/master/Encrypter.php#L101-163

这是我的经历:

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 的填充。有人有想法吗?

最佳答案

这应该有效:

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 可以移植到 JavaScript,如图 here .

关于php - 兼容性 AES-256-CBC Node/Laravel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39699791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com