【发布时间】:2019-10-11 11:23:19
【问题描述】:
互联网上有很多关于 JsonWebTokens 的信息,但关于使用它对 HTTP 消息的内容进行签名的信息并不多。
所以它可以签署自己的声明,但我不清楚是否有标准方式(和可用的实现)让它携带消息正文的签名(至少,下面的任何内容HTTP 标头)。
这是最重要的,因为如果另一个客户端自己窃取了令牌,它可能会被用来制作非法请求,直到它过期。
这是迄今为止我找到的关于该主题的唯一资源:API Message Integrity With JSON Web Token (JWT)。标题很有希望,但文章并没有真正说明如何去做,只是表明了这样做的兴趣。
顺便说一句,如果可以对正文的内容进行签名,那么签名验证的快速失败实现会很棒,例如分段验证(例如,丢弃消息如果它立即识别出前 10kB 已被篡改,而不必摄取整个 10MB 消息)。
更多详情
我知道 JWT 是一个 token,因此常见的用法是让授权方将令牌传递给客户端,然后客户端将其透明地转发到服务器的请求中。因此,身份验证方不知道客户端接下来会执行什么实际请求,并且无法签署此类请求的内容(这也是不切实际的,应该为每个请求发布不同的“令牌”)。 它只是将令牌提供给客户端,客户端将不加更改地将令牌附加到每个请求。
但我认为在现实世界中的某些情况下,JWT 也是由客户端自己(而不是第三方)生成的,这意味着客户端知道共享密钥,并为自己合法地签署请求。
在这种情况下,原则上客户端可以签署 http 正文的内容,而不仅仅是 JWT 令牌的内容。
总而言之,我怀疑 JWT 格式不适合这种签名。客户端和服务器应该定义自己的协议/格式来做到这一点。
【问题讨论】:
-
验证小数据的完整性确实有意义,但对于大数据,我认为这将是很多开销。另外我不知道是否存在任何标准方法或库来执行此操作,您必须从头开始烹饪。
-
可能Block cipher 可以减少繁重,因为我认为它们具有固定的内存占用,与请求的大小无关。我认为许多 HMAC 实现都使用分组密码作为密码函数。这将是一个 CPU 密集型操作,可能不是那么密集。
标签: security microservices sign tampering