Перестройте угловое шифрование на Android - PullRequest
0 голосов
/ 28 декабря 2018

Я хочу восстановить симметричное шифрование, которое я использую из угловой библиотеки в своем приложении для Android для расшифровки сообщений.

Это функции угловой библиотеки (https://www.npmjs.com/package/angular-encryption-service):

EncryptionService.prototype.generateKey = function (passphrase) {
        return this.config.getSalt().then(function (salt) {
            var /** @type {?} */ passphraseBytes = new textEncodingUtf8.TextEncoder().encode(passphrase);
            var /** @type {?} */ importedKeyPromise = window.crypto.subtle.importKey('raw', passphraseBytes, { 'name': 'PBKDF2' }, false, ['deriveKey']);
            var /** @type {?} */ derivedKeyPromise = importedKeyPromise.then(function (key) {
                return window.crypto.subtle.deriveKey({
                    'name': 'PBKDF2',
                    'salt': typescriptBase64Arraybuffer.decode(salt),
                    // This should take around 0.5s to 1s
                    'iterations': 1000000,
                    'hash': 'SHA-256'
                }, key, { 'name': 'AES-CBC', 'length': 256 }, false, ['encrypt', 'decrypt']);
            });
            return derivedKeyPromise;
        });
    };
    /**
     * @param {?} text
     * @param {?} key
     * @return {?}
     */
    EncryptionService.prototype.encrypt = function (text, key) {
        var /** @type {?} */ iv = new Uint8Array(16);
        window.crypto.getRandomValues(iv);
        return (window.crypto.subtle.encrypt({ 'name': 'AES-CBC', 'iv': iv }, key, new textEncodingUtf8.TextEncoder().encode(text)).then(function (cipherBuffer) {
            // Need to implement base64 stuff here:
            return typescriptBase64Arraybuffer.encode(iv.buffer) + ':' + typescriptBase64Arraybuffer.encode(cipherBuffer);
        }));
    };
    /**
     * @param {?} cipherText
     * @param {?} key
     * @return {?}
     */
    EncryptionService.prototype.decrypt = function (cipherText, key) {
        try {
            var /** @type {?} */ pieces = cipherText.split(':');
            if (pieces.length !== 2) {
                return Promise.reject(new Error('encrypted text not formatted properly; missing ":"'));
            }
            var /** @type {?} */ iv = typescriptBase64Arraybuffer.decode(pieces[0]);
            var /** @type {?} */ buffer = typescriptBase64Arraybuffer.decode(pieces[1]);
            return (window.crypto.subtle.decrypt({ 'name': 'AES-CBC', 'iv': iv }, key, buffer).then(function (decryptedBuffer) {
                return new textEncodingUtf8.TextDecoder().decode(new Uint8Array(decryptedBuffer));
            }));
        }
        catch (e) {
            return Promise.reject(e);
        }
    };

Я наткнулся на этот ответ: PBKDF2 с SHA256 на андроиде

Однако 1000000 итераций невозможно выполнить на моем телефоне (приложение умирает через минуту).

Так что у меня есть два варианта - либо переключить угловую библиотеку, либо найти способ сделать это в Android. Какой наилучший способ сделать это?

...