一文理解JWT鉴权登录的安全加固


一文理解JWT鉴权登录的安全加固

文章插图
有关JWT的基础知识,可以查看之前的博客: 快速了解会话管理三剑客cookie、session和JWT
在之前的博客《一文理解JWT在鉴权登录的应用》介绍了JWT在鉴权登录中的使用 。但是不恰当地使用 JWT 可能会对应用程序安全产生负面影响 。
本文将针对JWT在鉴权登录业务场景下的安全进行讲解 。
JWT使用时的安全建议1. 切勿在令牌中传输用户的敏感数据由于JWT的载荷部分是可以被明文获取的,因此,如果有效载荷中存在敏感信息的话,就会发生信息泄露 。
2. 传输令牌时一定要使用安全连接理由同上 。
3. 使用“刷新令牌”机制由于JWT是公开传输的,获取了令牌的黑客能够继续使用该JWT访问应用程序,所以使用最好双JWT机制降低安全风险 。使用方法在《一文理解JWT在鉴权登录的应用》有详细讲解 。
4. 增加JWT的业务参数,用于校验可以在Payload中增加一些业务上的字段,用于校验当前JWT是否被滥用 。例如增加设备号,用户uuid、权限的信息,可以与上下文的信息进行对照,提高爬虫的门槛与接口安全性 。
5. 始终验证并过滤从用户接收的数据kid是JWT header中的一个可选参数,它用于指定加密算法的密钥 。因为该参数可以由用户输入,系统并不知道用户想要读取的到底是不是密钥文件 。如果在没有对参数进行过滤的前提下,攻击者是可以读取到系统的任意文件的、造成SQL注入或命令注入等漏洞 。
{"alg" : "HS256","typ" : "jwt","kid" : "/etc/passwd"}{"alg" : "HS256","typ" : "jwt","kid" : "key11111111' || union select 'secretkey' -- "}
所以,验证并过滤从用户接收的数据是必要的 。
6. 提高对称加密的秘钥强度如果加密的密钥强度较弱的话,攻击者可以直接通过蛮力攻击方式来破解密钥,可以使用PyJWT、John Ripper或c-jwt-cracker进行破解测试 。PyJWT库具体地址看参考文档4 。c-jwt-cracker库集体地址看参考文档5 。
秘钥不定期的变化 。这对用户来说不太方便,因为他们将不得不再次通过身份验证,但这有助于避免安全问题的发生 。
7. 服务端增加授权签名算法的白名单签名算法可以确保JWT在传输过程中不会被恶意用户所篡改,但头部中的alg字段却可以改为None,即不使用签名算法 。这样的话,当signature设置为空时,后端将不执行签名验证 。
将alg字段改为none后,系统就会生成这样形式的JWT,然后将其提交给服务器并通过校验:
base64UrlEncode(header) + "." + base64UrlEncode(payload)
所以,有必要在服务端增加已授权算法的白名单,并删除所有与服务端上授权算法不同的签名算法的JWT 。
8. 最好只使用一个签名算法在使用非对称算法进行令牌签名的情况下,签名应使用私钥,而签名验证应使用公钥 。由于使用JWT的某些库包含逻辑错误——当收到用对称算法签名的令牌时,将使用公钥作为验证签名的secret 。由于公钥并不是秘密数据,因此黑客可能会获得公共服务密钥并用于签署自己的令牌 。
所以,当网站采用非对称加密验证,且不对签名算法进行限制的话,存在这样的漏洞:
  1. 通过一定手段,获取到非对称加密的公钥,将alg字段改为对称加密算法 。
  2. 使用公钥对JWT进行签名,发送给服务端 。
  3. 服务端会将对称加密的公钥作为验证签名的秘钥,使用对称加密算法对接收的JWT进行验证 。
为了说明这个问题,以下实验部分节选自参考文档7的部分内容:
使用非对称加密算法RS256,新建一个JWT如下:


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: