当攻击者获得对用于生成JWT的秘密的访问权限时会发生什么?

时间:2015-06-19 17:22:39

标签: node.js security jwt

据我了解JWT认证,它基本上是这样的:

  • 用户将登录凭据发送到服务器
  • 如果登录凭据正确,服务器会发出一个包含用户ID和用户名的JWT(或者在有效负载中想要识别用户的任何内容)
  • 此JWT是使用应用程序范围的秘密生成的,应该存储在环境变量
  • JWT由用户存储,例如在localStorage中,并随每个请求一起发送到服务器的标题
  • 使用应用程序范围的秘密验证来自auth标头的JWT。如果验证成功,我们知道谁发送了请求以及请求是否已获得授权。

但是如果攻击者获得了用于生成JWT的秘密的访问权限会怎样?这不像主密码吗?有了秘密和用户ID /用户名,任何人都可以为任何用户发布JWT,并基本上接管任何帐户。由于一小段信息会危及整个系统(而不仅仅是一个用户帐户),这不是一个巨大的缺陷吗?或者我错了?

2 个答案:

答案 0 :(得分:2)

如果你参与了所有这些加密的话,我建议你阅读一下Diffie-Hellman密钥交换技术。它允许双方在不知道共同秘密的情况下进行安全对话。它利用PK加密技术,基本上是以下类比:

1)我在一个盒子上放了一个挂锁,然后通过邮寄方式发给你。盒子里面是我想让你知道的一个秘密,在这种情况下是一个会话密钥。 2)您收到包裹并将自己的挂锁放在盒子上,然后通过邮件发回给我。 3)我收到带有两个锁的盒子并取下我自己的锁,只用你的锁就把它发回给你。 4)你再次收到这个盒子,取出你的锁并获取内容:一个除了我以外从未见过的会话密钥。

答案 1 :(得分:1)

您正在描述JWT受对称密钥完整性保护的机制,即在发送方和接收方之间共享的秘密。这只是保护JWT的一种选择,不可否认,它不是最安全的,因为它依赖于可能在两端丢失或被盗的秘密。在发件人无法保密的情况下(例如浏览器内客户端),它也没有用。当存在多个接收器时,它们的可管理性/可扩展性也较差,其中发送器需要为每个接收器管理一个共享密钥。

使用公共/私人密钥对来保护JWT是一个更安全的选择。在这种情况下,JWT将使用仅为发送方所知的私钥进行签名,并且接收方只知道公钥。当然,如果该私钥丢失,它将允许攻击者生成任意JWT并冒充用户,但由于攻击者显然已经可以访问服务器端基础设施,他甚至不需要冒充用户访问服务器端信息。

所以你是对的:由于其安全隐患,受共享秘密保护的JWT通常不太受欢迎,但是使用PKI机制保护它是一种更好的方法。