Невозможно отправить CryptoKey на сервер Express
На клиенте я создаю
CryptoKeyPair
объект, использующий
WebCrypto
API. Я хочу отправить эту пару ключей на свой экспресс-сервер с помощью API выборки, но все, что я получаю
req.body
это пустой объект. Почему это происходит?
Генерация ключей:
const keyPair = await crypto.subtle.generateKey(RsaOaepParams, true, ["encrypt", "decrypt"]);
POST запрос:
fetch('/', {
method: 'POST',
body: JSON.stringify(keyPair.publicKey),
headers: {
'Content-Type': 'application/json'
},
})
Нет, это не проблема
bodyParser
промежуточное ПО. Я правильно настроил.
JSON.stringify(keyPair.publicKey)
сам превращает объект в пустой
1 ответ
Для доступа к открытому ключу RSA требуется несколько элементов:
- Правильный алгоритм: РСА-ОАЭП
- Экспорт паблика в правильном формате ("jwk" или "spki")
Примечание. В вашем примере кода предполагается формат JWK. Обычно открытые ключи экспортируются в формате SPKI. См. второй пример.
Формат JWK для экспорта открытого ключа:
const params = {
name: "RSA-OAEP",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
}
const keyPair = await crypto.subtle.generateKey(
params,
true,
["encrypt", "decrypt"]);
const pubKey = await crypto.subtle.exportKey(
"jwk",
keyPair.publicKey);
fetch('/', {
method: 'POST',
body: JSON.stringify(pubKey),
headers: {
'Content-Type': 'application/json'
},
})
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint8Array(buf));
}
Формат SPKI для экспорта открытого ключа:
const params = {
name: "RSA-OAEP",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
}
const keyPair = await crypto.subtle.generateKey(
params,
true,
["encrypt", "decrypt"]);
const pubKey = await crypto.subtle.exportKey(
"spki",
keyPair.publicKey);
const b64 = btoa(ab2str(pubKey));
var pem = `-----BEGIN PUBLIC KEY-----\n${b64}\n-----END PUBLIC KEY-----`;
key = {
"public_key": pem
}
fetch('/', {
method: 'POST',
body: JSON.stringify(key),
headers: {
'Content-Type': 'application/json'
},
})