认证方案
1.1 jwt
-
对比状态保持机制
- APP不支持状态保持
- 状态保持有同源策略, 无法跨服务器传递
-
不可逆加密
- md5 sha1 sha256
- 主要用于数据认证, 防止数据被修改
-
消息摘要 MD
- 通过哈希算法将任意长度内容转为定长内容, 且相同内容的哈希值始终相同, 不同内容的哈希值不同(极小概率出现碰撞)
- 由于其唯一性, 一般将数据的哈希值称为数据的摘要信息, 称为数据的"指纹", 用于检测数据是否被修改
- 代表算法 sha1 sha256 md5
- 缺点
- 哈希算法是公开的, 如果可以获取到明文, 就可以穷举出使用的算法
-
消息认证 MA
- 哈希算法基础上混入秘钥, 防止哈希算法被破解, 避免签名被伪造
- 代表算法 hmacsha256
- JWT一般会采用
消息认证
机制- 一般的web应用, 不会将秘钥交给客户端 ,也就表示
客户端不会验签服务器的身份
- 一般的web应用, 不会将秘钥交给客户端 ,也就表示
- 缺点
- 一旦秘钥泄露, 仍然可以伪造签名
-
数字签名
- 利用非对称加密对摘要信息进行加密, 避免摘要信息被伪造
- 非对称加密采用秘钥对
- 公钥和私钥
- 公钥加密, 私钥解密
- 私钥加密, 公钥解密
- 私钥可以推出公钥, 公钥无法推出私钥
- 发送者使用私钥对数据摘要加密(签名), 接收者使用对应的公钥解密, 然后对数据进行哈希处理, 比对摘要信息是否一致
- 代表算法 RSA
- 使用场景
- 安全级别要求比较高的系统, 如银行等
- 优点
- 客户端不会像消息认证一样保存秘钥, 而是保存了非对称加密的公钥, 即使客户端被破解, 公钥被获取, 也无法通过公钥生成合法的签名
- 缺点
- 效率低
1.2 PyJWT
- 安装
pip install PyJWT
import jwt
from datetime import datetime, timedelta
from jwt import PyJWTError
# 包装数据 jwt的规范中要求通过exp参数来设置有效期, 要求有效期使用格林尼治时间
payload = {
'payload': 'test', 'exp': datetime.utcnow() + timedelta(seconds=30)}
key = 'secret'
# # 生成jwt
# token = jwt.encode(payload, key, algorithm='HS256')
# print(token)
token = b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjoidGVzdCIsImV4cCI6MTU2MjgwOTkzMn0.BSc0A2ibdjHTlmW7wtWfj5ZGkny8RX8tV12313'
# 验证jwt pyjwt内部对有效期进行了验证, 如果超过时间, 会报错
try:
ret = jwt.decode(token, key, algorithms='HS256')
print(ret)
except PyJWTError