Ich habe generic Krypta erstellt und entschlüsseln Funktionalität, es funktioniert gut, wenn ich eine beliebige Zeichenfolge zur Verfügung stellen, aber wenn ich in sha256
Hash-String zu übergeben versuchen, dann wirft Krypto einen Fehler - error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
NodeJS Krypto decrypt verhält inkonsequent
Hier der Code -
let crypto = require('crypto');
const secret = new Buffer('1234567890abcdef71234567890abcdef1234567890abcdef1234567890abcdef', 'hex');
const iv = new Buffer('1234567890abcdef1234567890abcdef', 'hex');
const config = {
secret: secret,
iv: iv
};
function encrypt(data, sec, siv) {
let dataBuffer = ((data instanceof Buffer)?data:Buffer.from(data));
let cipher = crypto.createCipheriv('aes-256-cbc', sec, siv);
let crypt = cipher.update(dataBuffer);
crypt += cipher.final('hex');
return Buffer.from(crypt, 'hex');
}
function decrypt(data, sec, siv) {
let dataBuffer = ((data instanceof Buffer)?data:Buffer.from(data));
let decipher = crypto.createDecipheriv('aes-256-cbc', sec, siv);
let decrypt = decipher.update(dataBuffer);
decrypt += decipher.final();
return Buffer.from(decrypt);
}
function main() {
let test = 'asdfqwerty';
let secretBytes = crypto.randomBytes(32);
let secretHash = Buffer.from(crypto.createHmac('sha256', config.secret).update(secretBytes).digest('hex'));
console.log('\nTesting test string\n===================');
console.log(test);
a = encrypt(test, config.secret, config.iv);
console.log(decrypt(a, config.secret, config.iv).toString());
console.log('\nTesting test string\n===================');
console.log(secretHash);
a = encrypt(secretHash, config.secret, config.iv);
console.log(decrypt(a, config.secret, config.iv).toString());
}
try {
main();
} catch (e) {
console.log(e);
}
Allerdings wird die Ausgabe wie folgt -
Testing test string
===================
asdfqwerty
asdfqwerty
Testing test string
===================
<Buffer 62 36 62 62 37 39 36 65 63 36 36 36 64 32 63 61 64 34 63 61 32 32 39 66 32 35 64 38 64 30 61 39 34 66 31 39 34 38 62 33 63 66 33 38 64 37 65 62 33 39 ... >
Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
at Decipheriv.final (crypto.js:181:26)
at decrypt (/project/test2.js:24:23)
at main (/project/test2.js:43:15)
at Object.<anonymous> (/project/test2.js:47:3)
at Module._compile (module.js:573:30)
at Object.Module._extensions..js (module.js:584:10)
at Module.load (module.js:507:32)
at tryModuleLoad (module.js:470:12)
at Function.Module._load (module.js:462:3)
at Function.Module.runMain (module.js:609:10)
ich kann nicht herausfinden, warum es funktioniert in der erste Testfall schlägt im zweiten Testfall noch fehl.
hier ein repl.it link zum Code ist
'typeof data === 'Puffer' wird niemals wahr sein. 'typeof' erzeugt nur' string', '' number' ', '' boolean'', '' function'', '' object'', '' symbol'' und ''undefined''; Du meintest wahrscheinlich 'Buffer.isBuffer (data)'. – Ryan
Sie sind so richtig. Danke dafür, ich dachte, ich würde meinen Verstand verlieren wegen etwas, das sich als super einfach herausstellt. Ich sollte 'instancesof' verwenden, um nicht' typeof' zu testen. Das behebt jedoch nicht das zugrunde liegende Problem, da Krypto-Methoden mit Buffers oder Strings arbeiten sollten – JayReardon