gpt4 book ai didi

javascript - Node.js v6.2.2 crypto.createCipheriv "Invalid key length"错误

转载 作者:行者123 更新时间:2023-12-03 06:30:02 26 4
gpt4 key购买 nike

以下是 multipassify 的来源.

该代码在 Node 6 下完美运行,但之后会出现错误。

错误如下所示:

crypto.js:184
this._handle.initiv(cipher, toBuf(key), toBuf(iv));
^

Error: Invalid key length
at Error (native)
at new Cipheriv (crypto.js:184:16)
at Object.Cipheriv (crypto.js:182:12)
at multipassify.encrypt (/Users/thomasreggi/Desktop/super-octopus/node_modules/multipassify/multipassify.js:52:25)
at multipassify.encode (/Users/thomasreggi/Desktop/super-octopus/node_modules/multipassify/multipassify.js:28:27)
at Object.<anonymous> (/Users/thomasreggi/Desktop/super-octopus/multi.js:8:26)
at Module._compile (module.js:541:32)
at Object.Module._extensions..js (module.js:550:10)
at Module.load (module.js:458:32)
at tryModuleLoad (module.js:417:12)

这是来源。

var crypto = require('crypto');

var BLOCK_SIZE = 16;

var multipassify = module.exports = function(secret) {
if (!(this instanceof multipassify)) return new multipassify(secret);
if (!(typeof secret == 'string' && secret.length > 0)) throw new Error('Invalid Secret');

// Use the Multipass secret to derive two cryptographic keys,
// one for encryption, one for signing
var hash = crypto.createHash("sha256").update(secret).digest('binary');
this._encryptionKey = hash.substring(0, BLOCK_SIZE);
this._signingKey = hash.substring(BLOCK_SIZE, 32);
return this;
};

multipassify.prototype.encode = function(obj) {
if (!obj) return;

// Store the current time in ISO8601 format.
// The token will only be valid for a small timeframe around this timestamp.
obj["created_at"] = new Date().toISOString();

// Serialize the customer data to JSON and encrypt it
var cipherText = this.encrypt(JSON.stringify(obj));

// Create a signature (message authentication code) of the ciphertext
// and encode everything using URL-safe Base64 (RFC 4648)
var token = new Buffer(cipherText + this.sign(cipherText),'binary').toString('base64');
token = token.replace(/\+/g, '-') // Replace + with -
.replace(/\//g, '_'); // Replace / with _

return token;
};

multipassify.prototype.generateUrl = function(obj, domain) {
if(!domain) return;
return "https://" + domain + "/account/login/multipass/" + this.encode(obj);
};

multipassify.prototype.sign = function (data) {
var signed = crypto.createHmac("SHA256", this._signingKey).update(data).digest('binary');
return signed;
}

multipassify.prototype.encrypt = function(plaintext) {
// Use a random IV
var iv = crypto.randomBytes(BLOCK_SIZE);
var cipher = crypto.createCipheriv('aes-128-cbc', this._encryptionKey,iv);

// Use IV as first block of ciphertext
var encrypted = iv.toString('binary') + cipher.update(plaintext, 'utf8', 'binary') + cipher.final('binary');
return encrypted;
}

我尝试将哈希值和 this._encryptionKey 转换为二进制。使用这个github issue作为指导,但我没有运气尝试让它在 Node 6 上工作。有人知道让它在更高版本的 Node 上工作的简单方法吗?

最佳答案

在存储库的分支中发现了修复程序。

https://github.com/achinn/multipassify/blob/176c7664c8458cdfb8f20fac97fe27b7b7d1bff4/multipassify.js

所有“二进制”语句都被删除,因为我相信这是默认的,所以来回切换没有意义。

我还注意到 Buffer.concat([value, value]) 正在使用 new Buffer(value + value)

var crypto = require('crypto');

var BLOCK_SIZE = 16;

var multipassify = module.exports = function(secret) {
if (!(this instanceof multipassify)) return new multipassify(secret);
if (!(typeof secret == 'string' && secret.length > 0)) throw new Error('Invalid Secret');

// Use the Multipass secret to derive two cryptographic keys,
// one for encryption, one for signing
var hash = crypto.createHash("sha256").update(secret).digest();
this._encryptionKey = hash.slice(0, BLOCK_SIZE);
this._signingKey = hash.slice(BLOCK_SIZE, 32);
return this;
};

multipassify.prototype.encode = function(obj) {
if (!obj) return;

// Store the current time in ISO8601 format.
// The token will only be valid for a small timeframe around this timestamp.
obj["created_at"] = new Date().toISOString();

// Serialize the customer data to JSON and encrypt it
var cipherText = this.encrypt(JSON.stringify(obj));

// Create a signature (message authentication code) of the ciphertext
// and encode everything using URL-safe Base64 (RFC 4648)
var token = Buffer.concat([cipherText, this.sign(cipherText)]).toString('base64');
token = token.replace(/\+/g, '-') // Replace + with -
.replace(/\//g, '_'); // Replace / with _

return token;
};

multipassify.prototype.generateUrl = function(obj, domain) {
if(!domain) return;
return "https://" + domain + "/account/login/multipass/" + this.encode(obj);
};

multipassify.prototype.sign = function (data) {
var signed = crypto.createHmac("SHA256", this._signingKey).update(data).digest();
return signed;
}

multipassify.prototype.encrypt = function(plaintext) {
// Use a random IV
var iv = crypto.randomBytes(BLOCK_SIZE);
var cipher = crypto.createCipheriv('aes-128-cbc', this._encryptionKey,iv);

// Use IV as first block of ciphertext
var encrypted = Buffer.concat([iv, cipher.update(plaintext, 'utf8'), cipher.final()]);
return encrypted;
}

关于javascript - Node.js v6.2.2 crypto.createCipheriv "Invalid key length"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38491146/

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