Попытка добавить данные в неподдерживаемом состоянии на Cipher.update
Ниже код работает
var crypto = require('crypto');
var cipher = crypto.createCipher('aes-128-cbc','abcdefghijklmnop')
var http = require('http')
var userStr = 'a134aad';
var crypted = cipher.update(userStr, 'utf8', 'hex');
crypted += cipher.final('hex');
console.log(crypted);
Но когда он помещается в обратный вызов сервера, он не работает и выдает ниже err при поступлении запроса, а узел находится в раздавленном состоянии:
http.createServer(function(req, res){
var userStr = 'a134aad';
var crypted = cipher.update(userStr, 'utf8', 'hex');
crypted += cipher.final('hex');
console.log(crypted);
res.end('hello');
}).listen(9888)
---------------------------------
7364aee753f0568f7e5171add6868b75
crypto.js:170
var ret = this._handle.update(data, inputEncoding);
^
Error: Trying to add data in unsupported state
at Cipher.update (crypto.js:170:26)
at Server.<anonymous> (C:\Users\58\Desktop\sha256.js:12:26)
at emitTwo (events.js:126:13)
at Server.emit (events.js:214:7)
at parserOnIncoming (_http_server.js:602:12)
at HTTPParser.parserOnHeadersComplete (_http_common.js:117:23)
3 ответа
Оказывается
var cipher = crypto.createCipher('aes-128-cbc','abcdefghijklmnop')
не должен использоваться повторно. Я положил его в обратный вызов сервера тоже, и проблема решена.
Проверь это
Это в основном потому, что каждый раз, когда мы запускаем шифрование или дешифрование, мы должны повторять crypto.createCipher('aes192', secrateKey);
а также crypto.createDecipher('aes192', secrateKey);
let secrateKey = "secrateKey";
const crypto = require('crypto');
function encrypt(text) {
encryptalgo = crypto.createCipher('aes192', secrateKey);
let encrypted = encryptalgo.update(text, 'utf8', 'hex');
encrypted += encryptalgo.final('hex');
return encrypted;
}
function decrypt(encrypted) {
decryptalgo = crypto.createDecipher('aes192', secrateKey);
let decrypted = decryptalgo.update(encrypted, 'hex', 'utf8');
decrypted += decryptalgo.final('utf8');
return decrypted;
}
let encryptedText = encrypt("hello");
console.log(encryptedText);
let decryptedText = decrypt(encryptedText);
console.log(decryptedText);
Надеюсь это поможет!
Вам нужно создать шифр перед его использованием. как:
let cipher = crypto.createCipher("aes-256-cbc", key, iv);
key
= может быть любой случайной строкой.(я предпочитаю использовать 32-битный ключ, потому что вы можете получить ошибку из-за не точного 32-битного ключа)
iv
= вектор инициализации.
и ключ, и iv должны быть в utf-8.
документация по оформлению заказа: https://nodejs.org/api/crypto.html#crypto_crypto_createcipheriv_algorithm_key_iv_options
Итак, окончательный код выглядит так:
http.createServer(function(req, res){
var userStr = 'a134aad';
let key = "123456781234567812345678";
let iv= crypto.randomBytes(16);
let cipher = crypto.createCipher("aes-256-cbc", key, iv);
var crypted = cipher.update(userStr, 'utf8', 'hex');
crypted += cipher.final('hex');
console.log(crypted);
res.end('hello');
}).listen(9888)
**Кроме того, если вы найдете какие-либо ошибки, не стесняйтесь исправлять меня!