我試圖解析和驗證基於此示例node.js的一個JWT令牌(在.NET編寫):https://github.com/liveservices/LiveSDK/blob/master/Samples/Asp.net/AuthenticationTokenSample/JsonWebToken.cs在node.js中驗證一個JWT
這裏是我的節點JS的JavaScript驗證令牌:
var validateSignature = function(key, claims, envelope, signature) {
var hasher = crypto.createHash('sha256');
hasher.update(key + "JWTSig");
var key = hasher.digest('binary');
var hmac = crypto.createHmac('sha256', key);
hmac.update(envelope + '.' + claims);
var out = hmac.digest('base64');
console.log(out);
console.log(signature);
console.log(out === signature);
}
現在,非常奇怪的是 - 它幾乎可行。這裏有三個的console.log語句的輸出:
pEwNPJ+LUHBdvNx631UzdyVhPFUOvFY8jG3x/cP81FE=
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
false
看來可疑的,我認爲哈希值是除了兩個相同的+ -/_ =
有人發現我的錯誤?與我的base64編碼有關。
UPDATE
我打出了一些更多,似乎有什麼時髦與base64編碼怎麼回事。在節點JS下面的代碼:
console.log(signature);
var b = new Buffer(signature, 'base64');
console.log(b.toString('base64'));
產量:
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
pEwNPJLUHBdvNx631UzdyVhPFUOvFY8jG3xcP81F
這似乎很奇怪,不是嗎?
這可能是因爲節點的HMAC函數輸出網頁或網址的安全哈希和你的代碼的其餘部分是正確的。 – 2012-01-15 02:10:47
就像那樣,我只是更新了 – ConfusedNoob 2012-01-15 03:46:13