簡體   English   中英

NodeJS加密RS-SHA256和JWT承載

[英]NodeJS Crypto RS-SHA256 and JWT Bearer

在使用passport和oauth2orize實現oauth2堆棧時,在這種情況下,問題特別在於使用oauth2orize jwt承載。 oauth2orize jwt bearer非常適合一切正常運行,但它有標記為RSA SHA的部分。

在嘗試放入用於RSA SHA加密處理的部分時,我無法獲得簽名以驗證為verifier.verify似乎總是返回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”上運行了base64, “typ”:“JWT”}和{“iss”上的base64:“myclient”}然后在這些編碼上運行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);

但結果總是錯誤的。

我正確接收數據,代碼中的簽名變量與我傳入的內容相匹配,我只是總是收到錯誤並且已經用盡所有我可以想到的關於如何調整這個以獲得verifier.verify返回的選項真正。 感謝您的時間和幫助!

我不確定這是否正是您所尋找的,但這將使用jwt-simple(使用加密等)以google 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 );

我認為這段代碼樣本完全不安全。 如果您查看最新的JWT代碼,它不會在您的解碼調用中使用該秘密。

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

它基本上只解碼第二個段並返回它,這意味着任何人都可以更改值並且未經驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM