当前位置: 首页 > 知识库问答 >
问题:

NodeJS Crypto RS-SHA256和JWT承载

慕项明
2023-03-14

在使用passport和oauth2orize实现oauth2堆栈时,在这种情况下,问题具体在于使用oauth2orize jwt承载。oauth2orize jwt承载器在让一切正常运行方面非常出色,但是它标记了RSA SHA片段。

在尝试为RSA SHA加密处理做好准备时,我无法获得作为验证器验证的签名。验证似乎总是返回false。如果有人已经越过了这个障碍,那么一点帮助就太好了。

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

openssl genrsa -out private.pem 1024
//extract public key
openssl rsa -in private.pem -out public.pem -outform PEM -pubout

现在要签名的数据:

{"alg":"RS256","typ":"JWT"}{"iss": "myclient"}

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

{eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9}.{eyJpc3MiOiAibXljbGllbnQifQ}

这给了我:e2V5SmhiR2NpT2lKU1V6STFOaUlzSW5SNWNDSTZJa3BYVkNKOX0ue2V5SnBjM01pT2lBaWJYbGpiR2xsYm5RaWZRfQ

此时,我通过执行以下操作签署上述base64:

openssl sha -sha256 -sign priv.pem < signThis > signedData

然后在此基础上运行base64,以获取要传递到断言签名部分的数据。然后我传入对象:

{
"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
"assertion":  "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiAibXljbGllbnQifQ.signedData"
}

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

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,并且已经用尽了我能想到的关于如何调整它以获得验证器的所有选项。验证以返回true。感谢您的时间和帮助!


共有2个答案

姬弘文
2023-03-14

我认为这个代码示例是完全不安全的。如果查看最新的JWT代码,它不会在解码调用中使用该密码。

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

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

周意智
2023-03-14

我不确定这是否正是您正在寻找的,但这将使用jwt-Simple(使用加密等)以谷歌api方式成功创建JWT:

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 );
 类似资料:
  • 我正在PHP中使用私钥创建一个JWT令牌。为此,我使用OpenSSL库。在任何事情之前,我将共享我的代码: PHP 所以,这个JWT令牌将用于我试图访问的服务器中的身份验证。但我从外部服务器得到的响应是一个错误的请求,我的JWT令牌创建中出现了问题。 使用相同的凭据,我使用库尝试了javascript,然后它给了我正确的响应。 JAVASCRIPT中文 我可以清楚地看到的一个区别是,对于php端的

  • 我已经在WSO2是5.3.0中安装并配置了JWT Grant Type,然后按照本指南配置了一个服务提供程序,启用OAuth/OpenID Connect入站身份验证器。我能够通过javascript客户机验证使用开放ID范围的OAuth2协议的用户,获得有效的JWT令牌(JWTToken)。 最后,我尝试使用REST客户机并设置content-type=application/x-www-for

  • import "crypto/sha256" sha256包实现了SHA224和SHA256哈希算法,参见FIPS 180-4。 Constants func Sum256(data []byte) [Size]byte func New() hash.Hash func Sum224(data []byte) (sum224 [Size224]byte) func New224() hash.H

  • 是否可以在ASP中支持多个JWT令牌发行者。净核心2?我想为外部服务提供一个API,我需要使用两个JWT代币来源——Firebase和定制JWT代币发行人。在ASP。NET core I可以为承载身份验证方案设置JWT身份验证,但只能为一个机构设置: 我可以有多个发行人和受众,但我不能设置多个权限。

  • 有两个ASP.NET核心Web API使用承载令牌身份验证。这些服务还提供静态文件,这些文件用于同意API进入消费应用程序的目录。所以这两个API都在Azure AD中启用了隐式流。 API2使用jwt-barer授权从Web API控制器调用API1。API2具有访问API1的权限。 来自第三个目录的用户导航到API2服务的SPA。用户被重定向到Azure AD,登录并同意API。用户被重定向回

  • 我编写了一个c程序,对字符数组执行sha256哈希,然后对sha256哈希函数的输出执行ripemd160哈希。 这是我的密码: } 问题就出在这一行: 无符号char*d=SHA256(raw-data, strlen(raw-data),0);当我将d指针(sha256函数的输出)传递给RIPEMD160函数时,RIPEMD160函数的哈希输出变为错误。谁能告诉我为什么会这样?以及如何纠正我的