как сгенерировать зашифрованный JWE с помощью node-jose

Я использую node-jose v0.11.0 (https://www.npmjs.com/package/node-jose) для операций JWK и JWE. У меня есть ключ RSA в формате JWK, который я могу загрузить в хранилище ключей JWK, а также снова извлечь. Однако, когда я пытаюсь что-либо зашифровать, я получаю ошибку «error2», «неподдерживаемый алгоритм». Как это возможно, что RSA является неподдерживаемым алгоритмом?

import * as jose from "node-jose";

const webkey = {
        "keys": [
            {
                "kty": "RSA",
                "e": "AQAB",
                "kid": "a024254d-0321-459f-9530-93020ce9d54a",
                "key_ops": [
                    "encrypt"
                ],
                "n": "jkHgYN98dlR2w7NX-gekCWaCdbxs7X4XXh52DVQrK--krwUYqRbBIUEw1bV8KX0ox6TLt-e6wpYsYYFUItSd5ySqohHRMq1IhyE2zpEC95BA9V7VrFUYnczf1bd5c-aR079aoz5JPXfqx01TzNfxWBb04SlRjsmJeY1v6JrDUI5U0FSOmnJTb3tSS6Szrvi_qOyViYp4v9V2_OVYy45kF_LQQy-pr-kP4gapXL235cieeTW6UvkhzaPT2D-JKyzVjjjgnfRXr8Ox9I9c4wpef2-5nPPeafB5EnOMpJE11KzO_8xxiTGUywPPLQagBvY35gkhQbYS2dv3NGIVSLZHFw"
            }
        ]
    };
    console.log("webkey", webkey);

    //generate key store from public JWK
    jose.JWK.asKeyStore(webkey)
        .then((result) => {
            console.log("Key Store", JSON.stringify(result.toJSON()));
            let keyStore = result;

            //get the key to encrypt
            const encryptionKey: jose.JWK.Key = keyStore.get(webkey.keys[0].kid);
            const output = jose.util.base64url.encode("Hello World");
            const output2 = jose.util.asBuffer(output);

            //encrypting content
            jose.JWE.createEncrypt(encryptionKey)
                .update(output2)
                .final()
                .then((jweInGeneralSerialization) => {
                    console.log("Encryption result", JSON.stringify(jweInGeneralSerialization));
                }, (error) => {
                    console.log("error2", error.message);
                });

        }, (error) => {
            console.log("error1", error.message);
        })

Результат выглядит следующим образом:

'webkey', Object{keys: [Object{kty: ..., e: ..., kid: ..., key_ops: ..., n: ...}]}
'Key Store', '{"keys":[{"kty":"RSA","kid":"a024254d-0321-459f-9530-93020ce9d54a","key_ops":["encrypt"],"e":"AQAB","n":"jkHgYN98dlR2w7NX-gekCWaCdbxs7X4XXh52DVQrK--krwUYqRbBIUEw1bV8KX0ox6TLt-e6wpYsYYFUItSd5ySqohHRMq1IhyE2zpEC95BA9V7VrFUYnczf1bd5c-aR079aoz5JPXfqx01TzNfxWBb04SlRjsmJeY1v6JrDUI5U0FSOmnJTb3tSS6Szrvi_qOyViYp4v9V2_OVYy45kF_LQQy-pr-kP4gapXL235cieeTW6UvkhzaPT2D-JKyzVjjjgnfRXr8Ox9I9c4wpef2-5nPPeafB5EnOMpJE11KzO_8xxiTGUywPPLQagBvY35gkhQbYS2dv3NGIVSLZHFw"}]}'
'error2', 'unsupported algorithm'

Обновление Я немного покопался в реальном коде и обнаружил в "basekey.js", что ошибка возникает из-за того, что алгоритмы библиотеки пусты.

 Object.defineProperty(this, "encrypt", {
 value: function(alg, data, props) {
  // validate appropriateness
  if (this.algorithms("encrypt").indexOf(alg) === -1) {
      console.log("Algorithm USED", alg
      );
      console.log("All algorithms", this.algorithms("encrypt"))
    return Promise.reject(new Error("unsupported algorithm"));
  }

Вот результат:

'Algorithm USED', 'A128CBC-HS256'
'All algorithms', []

person Ollyblink    schedule 07.02.2018    source источник
comment
Вам удалось это исправить? У меня такая же проблема.   -  person Niek    schedule 30.10.2018


Ответы (1)


У меня есть пример, который я добавил к другому вопросу: объяснение / пример node-jose?

Я использовал node-jose в исследовательском доказательстве, для отражения моего кода C # я создал только подписанные и зашифрованные токены для дешифрования и проверки на моем сервере (написанные на C #).

Мне нужно использовать симметричный секретный ключ или пару асимметричных открытых закрытых ключей?

Я использовал ключи RSA для асимметричных подписей и обертывания ключей для деталей симметричного шифрования содержимого. Алгоритм шифрования для шифрования контента - симметричный. Пакет node-jose сгенерировал симметричный ключ. Алгоритм Key Wrap зашифровал симметричный ключ.

Код C #, который у меня есть, расшифровывает и проверяет подпись токена. Обратите внимание: я использовал функции пакета для выполнения всей работы.

Вот мои записные книжки Runkit для тренировок:

для подписи (JWS) https://runkit.com/archeon2/5bd66a8e7ee3b70012ec2e39

для шифрования (JWE) https://runkit.com/archeon2/5bd6736ff36b39001313262a

В своем финале я объединил их, создав подписанный токен, а затем использовал вывод в качестве полезной нагрузки для зашифрованного (JWS + JWE). Я успешно использовал код сервера C # для расшифровки и проверки созданных токенов.

JWS + JWE: https://runkit.com/archeon2/jws-jwe-integration

Как мне нужно сгенерировать и где мне нужно хранить ключи в моем приложении серверного узла, чтобы затем я мог подписывать и проверять свои токены?

var store = jose.JWK.createKeyStore();
await store.generate("RSA",2048,{alg:"RS256", key_ops:["sign", "decrypt", "unwrap"]});
lkey = (await store.get());
var key = lkey.toJSON(); //get public key to exchange
key.use = "sig";
key.key_ops=["encrypt","verify", "wrap"];

var pubKey = await jose.JWK.asKey(key);
key = null;

Хранилище ключей можно сериализовать в JSON, поэтому я хотел бы сохранить его в хранилище сеансов или в локальном хранилище в браузере. Затем получите представление JSON и прочтите его в хранилище ключей.

var store= await jose.JWK.asKeyStore({"keys":[{"kty":"RSA","kid":"h9VHWShTfENF6xwjF3FR_b-9k1MvBvl3gnWnthV0Slk","alg":"RS256","key_ops":["sign","decrypt","unwrap"],"e":"AQAB","n":"l61fUp2hM3QxbFKk182yI5wTtiVS-g4ZxB4SXiY70sn23TalKT_01bgFElICexBXYVBwEndp6Gq60fCbaBeqTEyRvVbIlPlelCIhtYtL32iHvkkh2cXUgrQOscLGBm-8aWVtZE3HrtO-lu23qAoV7cGDU0UkX9z2QgQVmvT0JYxFsxHEYuWBOiWSGcBCgH10GWj40QBryhCPVtkqxBE3CCi9qjMFRaDqUg6kLqY8f0jtpY9ebgYWOmc1m_ujh7K6EDdsdn3D_QHfwtXtPi0ydEWu7pj1vq5AqacOd7AQzs4sWaTmMrpD9Ux43SVHbXK0UUkN5z3hcy6utysiBjqOwQ","d":"AVCHWvfyxbdkFkRBGX225Ygcw59fMLuejYyVLCu4qQMHGLO4irr7LD8EDDyZuOdTWoyP7BkM2e7S367uKeDKoQ6o1LND2cavgykokaI7bhxB0OxhVrnYNanJ1tCRVszxHRi78fqamHFNXZGB3fr4Za8frEEVJ5-KotfWOBmXZBvnoXbYbFXsKuaGo121AUCcEzFCGwuft75kPawzNjcdKhItfFrYh45OQLIO08W0fr_ByhxzWMU7yFUCELHSX5-4GT8ssq1dtvVgY2G14PbT67aYWJ2V571aSxM8DTwHrnB9tI8btbkXWt9JyVoQq13wDdo5fVN-c_5t07HBIaPoAQ","p":"8nLGa9_bRnke1w4paNCMjpdJ--eOUpZYbqEa8jnbsiaSWFwxZiOzUakIcpJ3iO0Bl28JEcdVbo7DE7mZ4M3BkOtm577cNuuK8243L7-k1a71X_ko2mQ3yF4rG2PzWAH_5P4wca1uk0Jj3PmhbkXDI6f_btm1X7Vw_U1K6jRhNbE","q":"oCe94Bed1Wzh-xgNq0hz52Z6WLf9eQlNxLzBbYkpLc_bGj9vMeGNO10qdxhWPi8ClkW9h5gBiFEk2s6aEWYRvIoZjrMYXD7xzyTNC5zcsikjNhM3FVj-kVdqUJy25o9uqgn2IwTvQr5WSKuxz37ZSnItEqK5SEgpCpjwEju_XhE","dp":"jAe2ir-0ijOSmGtZh2xMgl7nIFNRZGnpkZwDUDwSpAabJ-W3smKUQ2n5sxLdb3xUGv7KojYbJcvW6CGeurScQ_NycA9QaXgJvSe_QBjUP4bZuiDSc7DGdzfMdfl4pzAgeEZH_KBK6UrDGvIjRumMF6AEbCXaF_lX1TU7O6IdM0E","dq":"fDU2OjS2sQ5n2IAYIc3oLf-5RVM0nwlLKhil_xiQOjppF9s4lrvx96dSxti2EjYNUJQ34JBQJ_OenJ_8tx-tA8cq-RQHAYvDp75H1AjM1NO4vjh60PCbRgdAqdJQu1FkJzXgkdpC4UWSz3txRJaBWQ5hzIEtJ1Tnl5NzJQD3crE","qi":"3EoKqhKh5mwVGldSjwUGX7xnfQIfkQ4IETsQZh9jcfOFlf9f8rT2qnJ7eeJoXWlm5jwMnsTZAMg4l3rUlbYmCdg10zGA5PDadnRoCnSgMBF87d0mVYXxM1p2C-JmLJjqKhJObr3wndhvBXUImo_jV6aHismwkUjc1gSx_b3ajyU"},{"kty":"RSA","kid":"h9VHWShTfENF6xwjF3FR_b-9k1MvBvl3gnWnthV0Slk","use":"verify","alg":"RS256","key_ops":["encrypt","verify","wrap"],"e":"AQAB","n":"l61fUp2hM3QxbFKk182yI5wTtiVS-g4ZxB4SXiY70sn23TalKT_01bgFElICexBXYVBwEndp6Gq60fCbaBeqTEyRvVbIlPlelCIhtYtL32iHvkkh2cXUgrQOscLGBm-8aWVtZE3HrtO-lu23qAoV7cGDU0UkX9z2QgQVmvT0JYxFsxHEYuWBOiWSGcBCgH10GWj40QBryhCPVtkqxBE3CCi9qjMFRaDqUg6kLqY8f0jtpY9ebgYWOmc1m_ujh7K6EDdsdn3D_QHfwtXtPi0ydEWu7pj1vq5AqacOd7AQzs4sWaTmMrpD9Ux43SVHbXK0UUkN5z3hcy6utysiBjqOwQ","use":"sig"}]});

Как я могу узнать, какой из них используется между OCT, EC, RSA и т. Д.?

Это может диктовать потребность в подаче вашего токена. Мне нужно, чтобы получатель мог видеть содержимое, поэтому я выбрал RSA для асимметричных ключей. Подделка немного сложнее.

Эти ноутбуки в некоторой степени находятся в стадии разработки. Пожалуйста, просмотрите внимательно, так как это моя интерпретация и то, как я разработал то, что мне нужно. Я надеюсь, что они дадут какое-то руководство.

person Joseph    schedule 14.11.2018