这是我第一次使用JWT。我正在按指示使用jwcrypto库,我使用的密钥是我用OpenSSL生成的一个RSA密钥。
我最初的倾向是将JWT与用户的行一起存储在数据库中,然后在每次请求时根据数据库验证令牌的声明。
但是我突然想到,令牌有效负载是用我服务器的私钥签名的。
假设我的私钥从未被泄露过,那么是否可以安全地假设JWT中包含的所有数据(由用户表示为比勒令牌)都是防篡改的?我知道第三方可能会读到它,因为我没有加密。
我想知道的是,除了解密用户的JWT并让库告诉我有什么问题之外,我还需要做些什么来验证它吗?
发布于 2020-03-08 09:55:13
验证JWT的方法是检查它的算法、签名、过期和发行者。其他索赔也可以核实。
对于RS256,auth服务器将计算头部和有效负载的SHA256散列,并使用其私钥对其进行签名。要验证签名,依赖方再次计算头和有效负载的散列,并检查它是否匹配用公钥解密的签名。
由于头部和有效载荷没有加密,所以可以对它们进行篡改,但这样就无法匹配签名。
当服务器不检查"alg"字段[1]时,可能存在两个严重的漏洞。这是因为一些JWT库使用报头中提供的算法自动验证签名。
首先,如果黑客发送alg等于none的JWT,则不会检查签名。
其次,一些错误的库实现将对称密钥和非对称公钥存储在同一个变量中。如果您已经存储了一个RSA公钥,需要一个非对称算法,并且黑客发送了一个带有对称签名算法的JWT,那么您的服务器将检查JWT是否用公钥签名。因为黑客可以访问公钥,所以他们可以很容易地创建有效的JWT签名。
JWT库将检查当前发布时间iat和到期时间exp之间的时间。与检查exp不同,有些人更愿意检查当前的时间比发布的时间短,加上最大可接受的JWT生存期。
发行人iss应与预期的发行人相匹配。
1:https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries
https://security.stackexchange.com/questions/227014
复制相似问题