Объяснение / пример узла-хосе?

Я хочу использовать аутентификацию на основе токенов с JWT (если возможно, подписано и зашифровано). Я использую NodeJS на стороне сервера.

Я пытаюсь использовать этот модуль node-jose: https://github.com/cisco/node-jose

Я не знаю много о генерации / хранении ключей и криптографических алгоритмах. Даже если документация выглядит ясной, я не понимаю ключи частей и хранилища ключей (до части подписи): https://github.com/cisco/node-jose

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

Я предполагаю, что это зависит от того, что мне нужно, но из-за моего уровня в крипто, я не знаю, что мне нужно...

Тогда в части подписи, когда мне нужно использовать ключ, я плохо понимаю эту часть https://github.com/cisco/node-jose

  • Как я могу узнать, какой из них используется между OCT, EC, RSA и т. Д.? И, наконец, о каком входном буфере идет речь в части подписи?

Могу ли я получить объяснение / пример по этим вопросам?

Заранее спасибо.

1 ответ

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

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

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

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

Вот мои записные книжки для моих рабочих заданий:

для подписания (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();
key.use = "verify";
key.key_ops=["encrypt","verify", "wrap"];

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

Хранилище ключей можно сериализовать в 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"}]});

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

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

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

Другие вопросы по тегам