网站全屏视频怎么做,如何做影视网站,wex5 后端实现全网站开发,高明骏域网站建设前言
JWT#xff08;Json Web Token#xff09;是一种用于在网络应用之间安全地传输信息的开放标准。它通过将用户信息以JSON格式加密并封装在一个token中#xff0c;然后将该token发送给服务端进行验证#xff0c;从而实现身份验证和授权。
流程
JWT的加密和解密过程如…前言
JWTJson Web Token是一种用于在网络应用之间安全地传输信息的开放标准。它通过将用户信息以JSON格式加密并封装在一个token中然后将该token发送给服务端进行验证从而实现身份验证和授权。
流程
JWT的加密和解密过程如下
1、 生成JWT Token 客户端登录成功后服务器使用用户的信息如用户ID、用户名等以及服务器端的密钥通过特定的加密算法如HMACSHA256、RSA等生成JWT Token。
2、发送JWT Token 客户端将生成的JWT Token发送给服务器通常是通过HTTP请求的头部Authorization字段或者其他方式发送。
3、服务器验证JWT Token 服务器收到JWT Token后首先会对Token进行解析检查Token的格式是否正确并获取到头部和载荷部分的内容。
然后服务器使用存储在服务器端的密钥和相同的加密算法对头部和载荷进行签名验证以确认Token的真实性和完整性。
4、响应处理 如果JWT Token验证成功服务器可以根据用户的请求执行相应的操作并向客户端返回相应的响应。
如果JWT Token验证失败则服务器通常会返回相应的错误信息或拒绝服务。
认证区别
这里以传统Token验证方式与JWT验证方式做区分。
在传统Token方式中用户登录成功后服务端生成一个随机Token并分配给用户同时在服务端如数据库或缓存保存一份Token记录。随后用户在后续的请求中需携带该Token。服务端在接收到Token后会进行数据库或缓存的查询以验证Token的有效性和合法性包括检查Token是否超时或被篡改。
在JWT方式中用户登录成功后服务端使用JWT生成一个随机Token并将其发送给用户服务端无需在数据库或缓存中保存Token记录。用户在后续的请求中需要携带该Token。服务端在接收到Token后通过JWT对Token进行验证。
这两种方式的本质区别在于Token的验证和存储方式。
JWT组成
JWT包含三个部分头部Header、载荷Payload和签名Signature。
1、头部Header头部包含了两部分信息分别是令牌的类型typ和所使用的加密算法alg它们由json格式经base64url编码得到。base64url编码base64编码后用 - 替代 用 _ 替代/
例如
{alg: HS256,typ: JWT
}加密得到
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9该字符串成为了Header部分
2、载荷Payload载荷包含了要传输的用户信息如用户ID、用户名等。此外也可以包含其他自定义的信息。载荷的内容是经过base64url编码的能够被解码。
例如
{name: ice,phone: 123456789,address: ice.home
}编码得到
eyJuYW1lIjoiaWNlIiwicGhvbmUiOjEyMzQ1Njc4OSwiYWRkcmVzcyI6ImljZS5ob21lIn0该字符串成为了Payload部分
3、签名Signature签名用于验证token的真实性和完整性。签名是由头部、载荷以及密钥结合特定的加密算法生成的。
加密算法例如
HMACSHA256(base64UrlEncode(header) . base64UrlEncode(payload),ice
) 本例中对Header.Payload进行HS256加密密钥为ice后再进行base64url加密从而得到签名。 GJd4DLWt-IWWhE4ELHUXiLJjJG5C_HcvTY87c2s74Z0最后将三段字符串通过.拼接起来就生成了JWT的token
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiaWNlIiwicGhvbmUiOjEyMzQ1Njc4OSwiYWRkcmVzcyI6ImljZS5ob21lIn0.GJd4DLWt-IWWhE4ELHUXiLJjJG5C_HcvTY87c2s74Z0https://jwt.io/可用于编码、解码和验证JSON Web TokensJWT JWT攻击方式
1、修改加密算法伪造token
JWT中最常用的两种算法为HMAC和RSA。 HMAC是一种对称加密算法使用相同的密钥对传输信息进行加解密。 RSA是一种非对称加密算法使用私钥加密明文公钥解密密文。 若存在一场景某应用程序在JWT传输过程中使用RSA算法同时使用密钥ice对JWT token进行签名公钥abc对签名进行验证。
{alg : RS256,typ : jwt
}通常情况下密钥ice是无法获取到的但是公钥abc却可以通过某些途径得到此时将JWT的加密算法修改为HMAC同时使用获取到的公钥abc作为算法的密钥对token进行签名发送到服务器端
{alg : HS256,typ : jwt
}服务器端会将RSA的公钥abc视为当前算法HMAC的密钥而HMAC是对称加密算法故服务器使用密钥abc对接收到的签名进行验证从而造成token伪造问题。
2、None算法攻击绕过验证
在Header中指定alg为None同时不添加signature服务器在验证JWT时会认为这个JWT是不需要签名的从而跳过了对签名的验证直接信任JWT中的信息实现伪造身份绕过服务器验证。
HEADER
{alg : None,typ : jwt
}Payload
{username : Admin
}生成的完整token为
ew0KCSJhbGciIDogIk5vbmUiLA0KCSJ0eXAiIDogImp3dCINCn0.ew0KCSJ1c2VyIiA6ICJBZG1pbiINCn03、KID参数
“kid” 是 JWT 头部中的一个可选参数全称为 “Key ID”它用于指定加密算法所使用的密钥。
例如
{alg: HS256,typ: JWT,kid: signing_key
}或
{alg: HS256,typ: JWT,kid: /home/jwt/.ssh/pem
}由于该参数可控将导致以下漏洞。
3.1任意文件读取
系统并不会验证kid参数路径指向的文件是否是有效的密钥文件。因此在没有对参数进行过滤或验证的情况下可造成任意文件读取。
例如
{alg : HS256,typ : jwt,kid : ../../etc/passwd
}3.2SQL注入
kid参数也可能从数据库中提取数据故存在SQL注入攻击的风险。
例如
{alg : HS256,typ : jwt,kid : ice || union select users --
}3.3命令注入
若服务器后端使用的是Ruby在读取密钥文件时使用了open函数通过构造参数可能实现命令注入。
例如
{alg : HS256,typ : jwt,kid : /path/to/key_file|whoami
}其它语言可进行思路延申。
4、信息泄露
JWT确保的是数据传输过程中的完整性和真实性而不是机密性。由于payload是使用Base64url编码的相当于明文传输。因此如果在payload中携带了敏感信息例如存放密钥对的文件路径那么仅对payload部分进行Base64url解码就可以读取其中携带的信息。