Nodejs求助:Assertion failed: encoding == BINARY, file src\node.cc, line 1223
Nodejs求助:Assertion failed: encoding == BINARY, file src\node.cc, line 1223
在windows下使用node的对称加密报的错
var encipher = crypto.createCipheriv(‘aes-256-cbc’, setting.cookie_secret_key, iv), encoded = encipher.update(cryptdata, ‘base64’, ‘utf8’);
encoded += encipher.final( 'utf8' );
return decoded;
Node.js求助:Assertion failed: encoding == BINARY, file src\node.cc, line 1223
问题描述:
在Windows环境下使用Node.js进行对称加密时,遇到了以下错误信息:
Assertion failed: encoding == BINARY, file src\node.cc, line 1223
错误出现在使用crypto.createCipheriv
方法创建加密器,并调用update
方法时。
问题原因:
错误的原因在于update
方法中的编码参数不匹配。crypto.createCipheriv
和 update
方法需要一致的编码格式,以确保数据正确处理。
示例代码及解释:
以下是示例代码,展示了如何正确地使用crypto.createCipheriv
方法进行AES-256-CBC加密,并且避免上述错误。
const crypto = require('crypto');
// 设置密钥和初始向量(IV)
const setting = {
cookie_secret_key: "your_256_bit_secret_key", // 256位密钥
};
const iv = Buffer.alloc(16, 0); // 初始向量需要16字节
// 创建加密器
const cipher = crypto.createCipheriv('aes-256-cbc', setting.cookie_secret_key, iv);
// 待加密的数据
const cryptdata = "Your base64 encoded data";
// 使用base64编码更新数据
let encoded = cipher.update(cryptdata, 'base64', 'binary'); // 注意编码为'binary'
encoded += cipher.final('binary'); // 最终输出也使用'binary'
console.log(encoded.toString('hex')); // 输出加密后的数据,这里使用hex编码便于查看
关键点说明:
- 编码一致性:确保
update
和final
方法使用的编码一致,本例中均使用binary
。 - 编码转换:在最终输出时,可以将结果从
binary
转换为其他格式,例如hex
或base64
,以便于查看或传输。
通过以上修改,应该能够解决该错误并正常执行对称加密操作。
根据你提供的错误信息和代码片段,问题出在 crypto.createCipheriv
和 encipher.update
方法中的编码参数设置不正确。具体来说,update
方法的第一个参数 cryptdata
的编码格式应该是 'binary'
而不是 'base64'
。
以下是修正后的代码示例:
const crypto = require('crypto');
// 假设 setting.cookie_secret_key 和 iv 已定义
const encipher = crypto.createCipheriv('aes-256-cbc', setting.cookie_secret_key, iv);
// 确保 cryptdata 是二进制格式
let cryptdataBinary = Buffer.from(cryptdata, 'base64').toString('binary');
const encoded = encipher.update(cryptdataBinary, 'binary', 'utf8');
encoded += encipher.final('utf8');
return encoded;
解释:
- 创建 Cipher 对象:使用
crypto.createCipheriv
创建一个 Cipher 对象。 - 转换编码:将
cryptdata
从 base64 编码转换为二进制编码('binary'
)。 - 更新加密数据:使用
encipher.update
方法更新加密数据,并指定输入和输出的编码格式。 - 最终化加密:使用
encipher.final
方法完成加密过程,并获取最终的加密结果。
通过这些步骤,你可以避免 Assertion failed: encoding == BINARY
错误,并确保加密操作正常进行。