首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJS Crypto RS-SHA256和JWT承载

NodeJS Crypto RS-SHA256和JWT承载
EN

Stack Overflow用户
提问于 2013-12-27 04:25:01
回答 2查看 2.9K关注 0票数 3

在使用passport和oauth2orize实现oauth2堆栈时,在这种情况下,问题特别是在使用oauth2orize jwt承载时。RSA的持有者在让一切顺利进行方面做得很好,但是它有标记为要做的oauth2orize SHA部分。

在尝试将片段放入RSA SHA加密处理时,我无法获得要验证的签名,因为verifier.verify似乎总是返回false。如果有人已经扫清了这个障碍,那么一点帮助就更好了。

我所做的:创建私钥/公钥:

代码语言:javascript
复制
openssl genrsa -out private.pem 1024
//extract public key
openssl rsa -in private.pem -out public.pem -outform PEM -pubout

现在要签名的数据:

代码语言:javascript
复制
{"alg":"RS256","typ":"JWT"}{"iss": "myclient"}

关于如何签名,我尝试了多种方法,这里列举的方法太多了,但我对正确签名的理解是对这些项的bas64编码进行签名,所以我在{"alg":"RS256","typ":"JWT"}上运行base64,在{"iss":"myclient"}上运行base64,然后在这些编码上运行base64。所以结果是:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9 eyJpc3MiOiAibXljbGllbnQifQ然后编码:

代码语言:javascript
复制
{eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9}.{eyJpc3MiOiAibXljbGllbnQifQ}

这给了我:e2V5SmhiR2NpT2lKU1V6STFOaUlzSW5SNWNDSTZJa3BYVkNKOX0ue2V5SnBjM01pT2lBaWJYbGpiR2xsYm5RaWZRfQ

此时,我通过执行以下操作对上面的base64进行签名:

代码语言:javascript
复制
openssl sha -sha256 -sign priv.pem < signThis > signedData

然后,我在上面运行base64,以将数据传递到断言的签名部分。然后我传入对象:

代码语言:javascript
复制
{
"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
"assertion":  "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiAibXljbGllbnQifQ.signedData"
}

现在,在代码库中,我拥有:

代码语言:javascript
复制
var crypto = require('crypto')
   , fs = require('fs')
   , pub = fs.readFileSync('/path/to/pub.pem')
   , verifier = crypto.createVerify("RSA-SHA256");

verifier.update(JSON.stringify(data));

var result = verifier.verify(pub, signature, 'base64');
console.log('vf: ', result);

然而,结果总是假的。

我确实正确地接收了数据,代码中的签名变量与我传入的值是匹配的,我只是总是收到false,并且已经用尽了我能想到的所有选项来调整它以使verifier.verify返回true。感谢您的时间和帮助!

EN

回答 2

Stack Overflow用户

发布于 2014-06-14 04:57:13

我不确定这是否是您想要的,但这将使用jwt-simple (使用crypto等)以google api的方式成功创建一个JWT:

代码语言:javascript
复制
var fs       = require('fs')
  , jwt      = require('jwt-simple')
  , keypath  = '/path/to/your.pem'
  , secret   = fs.readFileSync( keypath, { encoding: 'ascii' })
  , now      = Date.now()
  , payload  = {
        scope: 'https://www.googleapis.com/auth/<service>',
        iss  : '<iss_id>@developer.gserviceaccount.com',
        aud  : 'https://accounts.google.com/o/oauth2/token',
        iat  : now,
        exp  : now+3600
    }
  , token    = jwt.encode( payload, secret, 'RS256' )
  , decoded  = jwt.decode( token, secret, 'RS256' );

console.log( token );
console.log( decoded );
票数 1
EN

Stack Overflow用户

发布于 2015-06-22 23:50:18

我认为这个代码样本是完全不安全的。如果您查看最新的JWT代码,它不会在您的decode调用中使用密钥。

https://github.com/hokaccha/node-jwt-simple/blob/master/lib/jwt.js

它基本上只是解码第二个段,并返回它,这意味着任何人都可以更改值,并且它没有得到验证。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20790821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档