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;

2 回复

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.createCipherivupdate 方法需要一致的编码格式,以确保数据正确处理。

示例代码及解释:

以下是示例代码,展示了如何正确地使用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编码便于查看

关键点说明:

  1. 编码一致性:确保updatefinal方法使用的编码一致,本例中均使用binary
  2. 编码转换:在最终输出时,可以将结果从binary转换为其他格式,例如hexbase64,以便于查看或传输。

通过以上修改,应该能够解决该错误并正常执行对称加密操作。


根据你提供的错误信息和代码片段,问题出在 crypto.createCipherivencipher.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;

解释:

  1. 创建 Cipher 对象:使用 crypto.createCipheriv 创建一个 Cipher 对象。
  2. 转换编码:将 cryptdata 从 base64 编码转换为二进制编码('binary')。
  3. 更新加密数据:使用 encipher.update 方法更新加密数据,并指定输入和输出的编码格式。
  4. 最终化加密:使用 encipher.final 方法完成加密过程,并获取最终的加密结果。

通过这些步骤,你可以避免 Assertion failed: encoding == BINARY 错误,并确保加密操作正常进行。

回到顶部