Con*_*oob 5 javascript authentication base64 node.js jwt
我正在尝试基于此示例(在 .NET 中编写)解析和验证 node.js 中的 JWT 令牌:https : //github.com/liveservices/LiveSDK/blob/master/Samples/Asp.net/AuthenticationTokenSample/ JsonWebToken.cs
这是我验证令牌的节点 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);
}
Run Code Online (Sandbox Code Playgroud)
现在,非常奇怪的是 - 它几乎可以工作。这是三个 console.log 语句的输出:
pEwNPJ+LUHBdvNx631UzdyVhPFUOvFY8jG3x/cP81FE=
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
false
Run Code Online (Sandbox Code Playgroud)
对我来说,除了 +-/_= 之外,哈希值都是相同的
有人发现我的错误吗?与我的 base64 编码有关。
更新
我又玩了一些,这里的 base64 编码似乎有些奇怪。节点js中的以下代码:
console.log(signature);
var b = new Buffer(signature, 'base64');
console.log(b.toString('base64'));
Run Code Online (Sandbox Code Playgroud)
产量:
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
pEwNPJLUHBdvNx631UzdyVhPFUOvFY8jG3xcP81F
Run Code Online (Sandbox Code Playgroud)
这看起来很奇怪,对吧?
感谢蒂莫西·米德的评论并推动我走向正确的方向。
Node 的 Buffer 类型生成带有 +、/ 和 = 的标准 Base64
这里提到了一个 URL 安全的 base64 编码: http: //en.wikipedia.org/wiki/Base64
它将 + 替换为 -,/ 替换为 _,= 是可选的。在 QueryString (d'uh) 上传递的令牌是 URL 安全版本。因此存在差异。
代码通过一个简单的修复:
out = out.replace('+','-').replace('/','_').replace('=','');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5007 次 |
| 最近记录: |