node-jose explain / example?

时间:2018-01-05 00:33:11

标签: javascript node.js key token jose

我想对JWT使用基于令牌的身份验证(如果可能,请进行签名和加密)。我在服务器端使用NodeJS。

我正在尝试使用此node-jose模块:https://github.com/cisco/node-jose

我不太了解生成/存储密钥&加密算法。即使文档看起来很清楚,我也不理解键和密钥库部分(直到签名部分): https://github.com/cisco/node-jose#keys-and-key-stores

  • 我需要如何生成以及我需要在我的服务器节点应用中存储密钥,然后允许我签署并验证我的令牌?我需要使用symetric密钥或不对称的公私钥对吗?

我认为这取决于我的需要,但由于我的加密水平,我不知道我需要什么......

然后在签名部分,当我需要使用密钥时,我不太了解这部分https://github.com/cisco/node-jose#keys-used-for-signing-and-verifying

  • 我怎么知道OCT,EC,RSA等之间使用哪一个?最后,他们在签名部分中讨论的输入缓冲区是什么?

我可以对这些问题有解释/示例吗?

提前谢谢。

1 个答案:

答案 0 :(得分:2)

我在研究证明中使用了node-jose,以反映我的C#代码,我只在服务器上以c#编写了签名和加密的令牌以进行解密和验证。

  

我需要使用对称密钥或不对称公共私钥对   ?

我将RSA密钥用于非对称签名,并且密钥包装了内容的对称加密详细信息。用于内容加密的加密算法是一种对称算法。 node-jose软件包生成了对称密钥。密钥包装算法对对称密钥进行了加密。

我拥有的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表示形式并读取Keystore。

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作为非对称密钥。伪造有点难。

这些笔记本有些正在进行中。请仔细检查,因为这是我的解释以及我如何制定所需的内容。我希望他们能提供一些指导。