Я реализую концепцию 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
. Пожалуйста, предоставьте мне решение для этого. Спасибо.