Crypto.subtle API веб-криптографии не определено в Apache Cordova

Я работаю с Cordova и библиотекой forge и Web Crypto API для выполнения sign и importKey операции. Тем не менее, Web Crypto API на устройстве Android предлагает только crypto.getRandomValues(), а значение SubtleCrypto не определено (crypto .тонкий). Поэтому я подумал о добавлении шрим Web Crypto API и его зависимости Promiz исправит отсутствие этой ссылки, но ничего не изменилось. Любая идея, пожалуйста?

Отладка на ПК в Chrome 52.0.2743.116 предлагает полный API Web Crypto, однако на устройстве Android с Chrome версии 52.0.2743.98 с Android 4.4.4. веб-API ограничен только crypto.getRandomValues().

Я в основном переписываю ответ из Как загрузить цифровой сертификат PKCS#12 с Javascript WebCrypto API

Пример кода:

Внутри index.html

<script src="lib/promiz.min.js"></script>
<script src="lib/webcrypto-shim.js"></script>

Внутри файла javascript

//working with forge without issue
var pkcs12Der = forge.util.decode64(pk);
var pkcs12Asn1 = forge.asn1.fromDer(pkcs12Der);
var pkcs12 = forge.pkcs12.pkcs12FromAsn1(pkcs12Asn1, false, "password");
console.log(pkcs12);

privateKey = null;
// load keypair and cert chain from safe content(s) 
for (var sci = 0; sci < pkcs12.safeContents.length; ++sci) {
    var safeContents = pkcs12.safeContents[sci];

    for (var sbi = 0; sbi < safeContents.safeBags.length; ++sbi) {
        var safeBag = safeContents.safeBags[sbi];

        // this bag has a private key
        if (safeBag.type === forge.pki.oids.keyBag) {
            //Found plain private key
            privateKey = safeBag.key;
        } else if (safeBag.type === forge.pki.oids.pkcs8ShroudedKeyBag) {
            // found encrypted private key
            privateKey = safeBag.key;
        } else if (safeBag.type === forge.pki.oids.certBag) {
            // this bag has a certificate...        
        }
    }
}

//function for importingKey 
function _importCryptoKeyPkcs8(privateKey, extractable) {
    var privateKeyInfoDerBuff = _privateKeyToPkcs8(privateKey);

    //import key will not work due to missing reference crypto.subtle
    return window.crypto.subtle.importKey(
        'pkcs8',
        privateKeyInfoDerBuff, {
            name: "RSASSA-PKCS1-v1_5",
            hash: {
                name: "SHA-256"
            }
        },
        extractable, ["sign"]);

}

_importCryptoKeyPkcs8(privateKey, true).
then(function(cryptoKey) {
   //sign will not work due to missing reference crypto.subtle
    window.crypto.subtle.sign({
                name: "RSASSA-PKCS1-v1_5"
            },
            cryptoKey,
            digestToSignBuf)
        .then(function(signature2) {

        });
});

person Marek    schedule 21.08.2016    source источник
comment
Можете ли вы показать нам пример кода? Особенно с библиотекой webcrypto-shim.   -  person e666    schedule 21.08.2016
comment
@e666 Добавлен пример кода. Не удается правильно сослаться на неопределенный window.crypto.subtle.   -  person Marek    schedule 21.08.2016
comment
Разве кузница не может сделать это полностью? Вы уверены, что вам вообще нужен window.crypto?   -  person Artjom B.    schedule 21.08.2016
comment
Я думаю, что WebCryptographyApi недоступен для Android WebView, но зачем вам WebCrypto или подделка? Android имеет встроенную поддержку файлов pkcs12, подписи и проверки. Даже он имеет встроенное хранилище ключей с версии 18 developer.android.com/training/articles/keystore .html. Я понимаю, что минус в том, что для подключения из Кордовы нужен родной компонент. В качестве альтернативы, я думаю, вы могли бы использовать только кузницу, как предлагает @ArtjomB.   -  person pedrofb    schedule 21.08.2016
comment
Одна из идей, лежащих в основе WebCrypto API в браузерах, заключается в том, чтобы позволить вам выполнять безопасные криптографические вычисления с использованием Javascript в браузерах. Используя shims и pollyfills, вы просто заставляете свое приложение работать, но с меньшей безопасностью.   -  person Emad Van Ben    schedule 08.11.2016


Ответы (2)


Предполагается, что SubtleCrypto не определен в небезопасных контекстах. Я предполагаю, что вы использовали протокол http. Переключитесь на https, чтобы решить проблему. Однажды я потратил впустую 4 часа времени разработки из-за этого.

Редактировать: Если SubtleCrypto не определен, и вы вызвали для него какую-то функцию, вы ожидаете, что будет сообщение об ошибке, но не будет никаких ошибок, предупреждений или чего-то еще. Ничего. Это было бы похоже на вызов пустой функции. Настоящая боль, когда вы отлаживаете.

person Shiva Teja    schedule 25.07.2019

У меня также было много проблем с Web Crypto API в приложении Cordova, и я не нашел решения для импорта или сохранения ключей.

Но то, что я нашел вчера, это JS-библиотека:

https://github.com/wwwtyro/cryptico

Может быть, вы можете изменить свой код и использовать его.

person Joerg    schedule 23.08.2016