gpt4 book ai didi

javascript - node crypto和crypto-js加解密的兼容性

转载 作者:行者123 更新时间:2023-11-30 16:15:56 27 4
gpt4 key购买 nike

我如何使用 crypto 模块(服务器端)和 crypto-js(客户端,react-native)正确地加密/解密 node.js 之间的数据?

注意:我在 react-native 项目中使用 cryptojs,因此我不能在客户端上使用 crypto。替换加密服务器端对我来说不是一个选择。

服务器端代码:

var Crypto = require("crypto");

var Cipher = {
pass: "0123456789abcdef0123456789abcdef",
iv: "0123456789abcdef",
encript: function (msg) {
try {
var cipher = Crypto.createCipheriv("aes-256-cbc", this.pass, this.iv);
var hash = cipher.update(msg, 'utf8', "hex");
var hex = hash + cipher.final("hex");
return hex;
} catch (err) {
console.error(err);
return "";
}
},
decript: function (hex){
try {
var decipher = Crypto.createDecipheriv("aes-256-cbc", this.pass, this.iv);
var dec = decipher.update(hex, "hex", 'utf8');
return dec + decipher.final('utf8');
} catch (err) {
console.error(err);
return "";
}
}
}
Cipher.encript("i have an apple"); // 577267026f88f82ea286baf6bf089acb
Cipher.decript("577267026f88f82ea286baf6bf089acb"); // i have an apple

客户端代码

var CryptoJS = require("crypto-js");
var Cipher = {
pass: CryptoJS.enc.Hex.parse("0123456789abcdef0123456789abcdef"),
iv: CryptoJS.enc.Hex.parse("0123456789abcdef"),
encript: function (msg) {
try {
var options = { mode: CryptoJS.mode.CBC, iv: this.iv};
var json = CryptoJS.AES.encrypt(msg, this.pass, options);
return json.ciphertext.toString(CryptoJS.enc.Hex);
} catch (err) {
console.error(err);
return "";
}
},
decript: function (hex){
try {
// ???????????????????????????????????
// ???????????????????????????????????

} catch (err) {
console.error(err);
return "";
}
}
}

Cipher.encript("i have an apple"); // 405552d9a77ea9e29442057d27cd7aee
Cipher.decript(?????); // I have no Idea

最佳答案

您的“密码”(用作 key 而不是密码)在客户端和服务器端有两种不同的编码。在客户端上,您将其解析为十六进制,但在服务器上,您将其作为二进制字符串传递,并按原样使用。

您要么需要在服务器上解析它(现在它是 AES-128 而不是 AES-256):

pass: new Buffer("0123456789abcdef0123456789abcdef", "hex"),

或者更改客户端的编码(从 AES-128 到 AES-256):

pass: CryptoJS.enc.<b>Utf8</b>.parse("0123456789abcdef0123456789abcdef"),

  encript: function (msg) {
try {
var options = { mode: CryptoJS.mode.CBC, iv: this.iv};
var json = CryptoJS.AES.encrypt(msg, this.pass, options);
return json.ciphertext.toString(CryptoJS.enc.Hex);
} catch (err) {
console.error(err);
return "";
}
},
decript: function (hex){
try {
var options = { mode: CryptoJS.mode.CBC, iv: this.iv};
var json = CryptoJS.AES.decrypt({
ciphertext: CryptoJS.enc.Hex.parse(hex)
}, this.pass, options);
return json.toString(CryptoJS.enc.Utf8);
} catch (err) {
console.error(err);
return "";
}
}

您仍然有安全问题:

  • 必须为同一 key 下的每个加密随机选择 IV,以实现语义安全。它不必是 secret 的,因此您只需将它与密文一起发送即可。通常将其添加到密文前并在解密前将其切掉。

  • 最好对您的密文进行身份验证,这样像 padding oracle attack 这样的攻击就不可能发生。这可以使用 GCM 或 EAX 等经过身份验证的模式,或使用 CryptoJS 提供的具有强 MAC 的 encrypt-then-MAC 方案(例如 HMAC-SHA256)来完成。

关于javascript - node crypto和crypto-js加解密的兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35532660/

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