【问题标题】:Secure JSON Web Token in Web API / MVC 6Web API / MVC 6 中的安全 JSON Web 令牌
【发布时间】:2015-09-19 03:54:51
【问题描述】:

安全问题: 根据https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/,许多 JWT 库使用令牌本身来确定签名的算法。

这是我们的用例: 我们想创建一个登录机制,使用硬凭证(用户名/密码)验证用户,然后返回一个 JWT 令牌,例如3 天寿命。令牌应包含用户名,签名应保证令牌不会被“伪造”。

我们可以在 Web API / MVC 6 中使用什么库?重要的是可以在解码时指定签名算法以避免漏洞。

如果可能,我们希望避免集成复杂的 OAuth 组件。

【问题讨论】:

  • 经过一番谷歌搜索后,我发现了两个有趣的东西:GitHub 上的开源项目 - jwt-dotnet:github.com/jwt-dotnet/jwt 和 NuGet 上 Microsoft .NET Framework 4.5 的 JSON Web 令牌处理程序:@ 987654323@好像都可以提供JWT令牌的生成和验证,但是我没用过,
  • 我看到了这些。我不知道他们是否提供 spec.of 算法验证。

标签: asp.net-web-api oauth-2.0 single-page-application jwt asp.net-core-mvc


【解决方案1】:

我正在使用System.IdentityModel.Tokens.Jwt 库,我刚刚检查了这个问题。我生成了一个令牌并在我的一个测试中对其进行了验证,然后我删除了 signingCredentials 这将 alg 更改为无。使用 "alg":"none" 生成的 JWT 验证失败

这是我生成令牌的方式:

public string GenerateToken(SSOContext context, SignatureSettings settings)
{
    var token = new JwtSecurityToken(
        issuer: "MyIssuer",
        audience: "MyAudience",
        claims: GetClaims(context),
        //comment the below line to generate a 'none' alg
        signingCredentials: new X509SigningCredentials(settings.Certificate),
        notBefore: DateTime.UtcNow,
        expires: DateTime.UtcNow.AddHours(1)
        );

    return new JwtSecurityTokenHandler().WriteToken(token);
}

当我验证令牌时,我收到消息中的预期异常

IDX10504:无法验证签名,令牌没有 签名:

【讨论】:

  • 当我在网上阅读有关该漏洞的 cmets 时,为了安全起见,唯一的方法是在硬编码的验证上定义预期的算法。这个库有可能吗?据我了解,至少它不会受到无算法问题的影响。也许您可以确认或添加其他信息。
  • 您可以获取 jwt 并将其转换为 JwtSecurityToken 对象并检查 SignatureAlgorithm 属性以确保它也是预期的。如果不是,您甚至都懒得验证并拒绝它。 link如果您发现任何问题,请告诉我。我正在回答部分问题,看看是否有人发现错误。
  • 这一切在我看来都是合理和可靠的,我想我很快就会接受你的回答。我不确定我是否可以在赏金结束之前进行全面测试。所以我想我需要尽快接受它,以防止失去奖励。
猜你喜欢
  • 2020-11-13
  • 2016-07-20
  • 2016-06-09
  • 2019-12-19
  • 2018-06-11
  • 1970-01-01
  • 2016-05-21
  • 2014-10-03
  • 2013-10-22
相关资源
最近更新 更多