Angular 8 не может импортировать ключи RSA с помощью webcryptoAPI - PullRequest
0 голосов
/ 03 марта 2020

Я реализую концепцию Digital Signature в Angular 8 клиенте и Python Flask сервере. Я создал RSA-2048 ключи для клиента и сервера от flask, используя pycryptodome. Я использую webcrypto API в Angular. Я хочу импортировать ключи клиента для подписи и проверки. Однако я не могу импортировать ключи.

Генерация ключа RSA в Flask:

import os
import sys
from Crypto.PublicKey import RSA
from Crypto.Util import asn1
from base64 import b64decode

arg = sys.argv[1]    //arg can be 'server' or 'client'
key_path = os.path.join('keysTemp')

#generate private key
key = RSA.generate(2048)
private_key = key.export_key()
file_out = open(os.path.join(key_path, arg + ".private.pem"), "wb")
file_out.write(private_key)

#generate public key
public_key = key.publickey().export_key()
file_out = open(os.path.join(key_path, arg + ".public.pem"), "wb")
file_out.write(public_key)

Angular Фрагмент кода (component.ts)

export class AppComponent {
    constructor(private http: HttpClient) { }

    str2ab(str) {
        const buf = new ArrayBuffer(str.length);
        const bufView = new Uint8Array(buf);
        for (let i = 0, strLen = str.length; i < strLen; i++) {
            bufView[i] = str.charCodeAt(i);
        }
        return buf;
    }
    async importKeys(code: string){
        try {
            let data = await this.http.get('assets/keys/client.private.pem', {responseType: 'text'}).toPromise();
            // fetch the part of the PEM string between header and footer
            const pemHeader = "-----BEGIN RSA PRIVATE KEY-----";
            const pemFooter = "-----END RSA PRIVATE KEY-----";
            const pemContents = data.substring(pemHeader.length, data.length - pemFooter.length);
            console.log('pemContents: ', pemContents);
            // base64 decode the string to get the binary data
            const binaryDerString = atob(pemContents);
            console.log('binaryDerString: ', binaryDerString);
            // convert from a binary string to an ArrayBuffer
            const binaryDer = this.str2ab(binaryDerString);
            console.log('client private key: ', binaryDer);
            return binaryDer;
        }catch (error) {
          console.error('error ', error);
        }
    }

    async digitalSignature(data){
        let messageDigest = (CryptoJS.MD5(data)).toString();
        console.log('messageDigest: ', messageDigest);

        let clientPrivateKey = await this.importKeys();
        console.log('clientPrivateKey: ', clientPrivateKey);

        try {
            let result = await window.crypto.subtle.importKey('pkcs8', clientPrivateKey, {
                name: "RSA-OAEP",
                hash: {
                    name: "SHA-256"
                }
            }, false, ["decrypt", "sign"]);
            console.log('import result: ', result);
        } catch (error) {
            console.error('error in import: ', error);
        }
    }
}

Теперь, когда я запускаю приложение, клиент генерирует массив буферов, но выдает DOMexception как ошибку. Не удается преобразовать файл .pem в объект CryptoKey. Пожалуйста, предоставьте мне решение для этого. Спасибо.

1 Ответ

0 голосов
/ 05 марта 2020

Хорошо, после лота поиска inte rnet я нашел эту библиотеку: node-forge для angular. Он имеет широкий спектр криптографических алгоритмов c. Для flask я использовал pycryptodome. См. Подробную информацию для node-forge

...