Web Crypto API с использованием Microsoft Edge (38.14393.0.0)

Я использую Web Crypto API (https://www.w3.org/TR/WebCryptoAPI/) успешно работает в Chrome (с момента первой поддержки Web Crypto), Firefox (с момента первой поддержки Web Crypto) и даже в Safari TP (10.2) с поддержкой WebCrypto Liner, заполнение для WebCrypto API (https://github.com/PeculiarVentures/webcrypto-liner).

Теперь я хочу протестировать наш код с помощью Microsoft Edge. Но зашифровать и расшифровать образец ArrayBuffer уже не удается. Вот код:

var crypto = window.crypto;
if (crypto.subtle) {
    var aesGcmKey = null;
    // always create a new, random iv in production systems!!!
    var tempIv = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
    // needed for edge, if additional data missing decrypting is failing
    var tempAdditionalData = new Uint8Array(0);
    var dataToEncrypt = new Uint8Array([1, 2, 3, 4, 5]);

    // 1.) generate key
    var generateKeyPromise = crypto.subtle.generateKey(
        {name: "AES-GCM", length: 256}, true, ["encrypt", "decrypt"]
    );
    generateKeyPromise.then(function (tempKey) {
        aesGcmKey = tempKey;
        // 2.) start encryption with this key
        var encryptedDataPromise = crypto.subtle.encrypt(
            {name: "AES-GCM", iv: tempIv, additionalData: tempAdditionalData, tagLength: 128},
            aesGcmKey,
            dataToEncrypt
        );
        encryptedDataPromise.then(function (encryptedData) {
            // 3.) decrypt using same key
            var decryptedDataPromise = crypto.subtle.decrypt(
                {name: "AES-GCM", iv: tempIv, additionalData: tempAdditionalData, tagLength: 128},
                aesGcmKey,
                encryptedData
            );
            decryptedDataPromise.then(function (decryptedData) {
                // 4.) compare decrypted array buffer and inital data
                console.log('data decrypted!');
                console.log(decryptedData);
            });
            decryptedDataPromise.catch(function (error) {
                console.log('decrypting sample data failed');
                console.log(error);
            });
        });
        // if 2.) is failing
        encryptedDataPromise.catch(function (error) {
            console.log('encrypting sample data failed');
            console.log(error);
        });
    });
    // if 1.) is failing
    generateKeyPromise.catch(function (error) {
        console.log('creating aec gcm key failed');
        console.log(error);
    });
}

Этот код не работает на этапе расшифровки (шаг 3 в коде) в Edge, но отлично работает в Chrome, Firefox и даже Safari. Проводная часть заключается в том, что decryptedDataPromise отклоняется с исключением, но возвращаемые данные вообще не выглядят как исключение:

[object Object] {additionalData: Uint8Array {...}, iv: Uint8Array {...}, name: "AES-GCM", tagLength: 128}

Кто-нибудь знает, почему это не работает в Microsoft Edge?


person developer346    schedule 21.03.2017    source источник
comment
этот живой пример diafygi.github.io/webcrypto-examples показывает, что AES-GCM работает в Край. Так что это будет из-за небольшой разницы в параметрах. Не могли бы вы попробовать капельницу размера 12 вместо 16?   -  person pedrofb    schedule 21.03.2017
comment
в дополнение к комментарию выше, кажется, вам нужно var tempAdditionalData = new Uint8Array(1); примечание: 1, а не 0   -  person Jaromanda X    schedule 22.03.2017


Ответы (2)


Как было предложено в комментариях, изменение IV на размер 12 вместо 16 и дополнительные данные, содержащие 1 вместо 0, устраняют проблему в Edge.

var tempIv = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
var tempAdditionalData = new Uint8Array(1);

Ваш комментарий о дополнительных данных, "// необходимых для Edge, если дополнительные данные, отсутствующие при расшифровке, не работают" действительно не нужны. additionalData может быть недействительным

Я искал в MSDN информацию о шифровании. операция, но это поведение не задокументировано. Поэтому я думаю, что реализация WebCrypto недостаточно зрелая, и все еще есть небольшие ошибки.

person pedrofb    schedule 22.03.2017

В Edge 41 исходный код ведет себя так же. Однако установка tempAdditionalData на null решает проблему, и расшифровка выполняется успешно.

person sw0rdf1sh    schedule 27.07.2018