Невозможно отправить CryptoKey на сервер Express

На клиенте я создаю CryptoKeyPair объект, использующий WebCryptoAPI. Я хочу отправить эту пару ключей на свой экспресс-сервер с помощью 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'
        },
})
Другие вопросы по тегам