Шифрование с помощью Crypto Node.js и дешифрование с помощью window.crypto в Service-Worker
Исходный код: https://github.com/HectorAnadon/Crypto-NodeJS-window.crypto
Я использую AES-128-GCM для отправки зашифрованного изображения с сервера node.js сервисному работнику (сценарий выполняется на фоне веб-браузера), где я пытаюсь его расшифровать. Связь работает хорошо, потому что незашифрованные изображения отображаются в веб-браузере.
ПРОБЛЕМА: когда я дешифрую в сервисном работнике, в обещании cryptoSubtle.decrypt я получаю одно исключение, это то, что печатает консоль для меня: Ошибка дешифрования: OperationError: (анонимная функция) @ service_worker.js:310
Строка 310 в файле service_worker.js: console.error("Ошибка расшифровки: + ошибка); // Строка 310
Ты хоть представляешь, что я делаю не так? Большое спасибо, я действительно ценю это.
Вот код шифрования с использованием Crypto Node.js (документ здесь: https://nodejs.org/api/crypto.html)
// Nodejs encryption with GCM
// Does not work with nodejs v0.10.31
var fs = require('fs');
var crypto = require('crypto');
var algorithm = 'aes-128-gcm';
var key = '3zTvzr3p67VC61jm';
// generate a new iv for each encryption
// As this is for testing I always use the same iv
var iv = '60iP0h6vJoEa';
function encrypt(text) {
var cipher = crypto.createCipheriv(algorithm, key, iv)
var encrypted = cipher.update(text);
return encrypted;
}
var text = fs.readFileSync('mustang_encrypted.jpg');
var hw = encrypt(text);
И это код дешифрования в Сервисном работнике, использующий window.crypto (документ здесь: https://developer.mozilla.org/en-US/docs/Web/API/Window/crypto)
//ArrayBuffer of the data we received
function(bodyArrayBuffer) {
var cryptoObj = crypto;
var cryptoSubtle = cryptoObj.subtle;
/*
* IMPORT KEY
*/
string2ArrayBuffer("3zTvzr3p67VC61jm", function (keyBuffer) {
console.log("keyBuffer length: " + keyBuffer.byteLength);
cryptoSubtle.importKey(
"raw", //can be "jwk" or "raw"
keyBuffer,
{ //this is the algorithm options
name: "AES-GCM",
},
false, //whether the key is extractable (i.e. can be used in exportKey)
["encrypt", "decrypt"] //can be any combination of "encrypt" and "decrypt"
).then(function(key){
//returns the symmetric key
/*
* DECRYPTION
*/
string2ArrayBuffer("60iP0h6vJoEa",function (myIV) {
cryptoSubtle.decrypt(
{
name: "AES-GCM",
iv: myIV, //The initialization vector you used to encrypt
tagLength: 128, //The tagLength you used to encrypt
},
key, //from generateKey or importKey above
bodyArrayBuffer //ArrayBuffer of the data
)
.then(function(decrypted){
//returns an ArrayBuffer containing the decrypted data
console.log(new Uint8Array(decrypted));
//send response
var newResponse = new Response(decrypted, init);
console.log("Returning \"decrypted\" response!");
accept(newResponse);
})
.catch(function(err){
console.error("Decryption error: " + err); //Line 310
});
});
})
.catch(function(err){
console.error(err);
});
});
}
1 ответ
Если я правильно помню, объект окна недоступен из ServiceWorker, поэтому, если вы пытаетесь получить доступ window.crypto
это приведет к ошибке.