加密/JWT-计网(4)
Date:
接上文,JWT是比较常用的解决登录认证问题的方式,JWT的结构是咋样的?安全嘛?
目录
加密算法
数据在网络中传输,需要加密,防止被窃取,篡改,常见的加密算法包括以下
- 对称加密
- 核心思路:用同一个密钥,在发送端对明文数据进行加密得到密文,再在接收端对密文进行解密还原得到明文
- 特点:加密解密速度快,适合大量数据加密
- 缺点:因为要共享密钥,在网络中分发密钥时,泄露风险大
- 非对称加密
- 核心思路:用一对密钥,一个公钥一个私钥,在发送端公钥加密,在接收端私钥解密
- 特点:难破解
- Hash散列加密
- 常见的:MD4,MD5,SHA-1加密
- 特点:不可逆,不可解密,同样的明文,加密后的密文是唯一的,暴力破解难度大
- 应用: 用户的密码,直接散列机密后存储,不存储明文;文件指纹:文件名中添加散列值,避免浏览器缓存
JWT
我们知道Cookie, LocalStorage可以存用户登录信息,简单的实现方式是把登录后的用户信息JSON存储在客户端, 这样有几个问题:
- 存储令牌过期时间
- 避免令牌被伪造
JWT(JSON Web Token) 是解决这个问题的方案,它是一种开放标准,用于在网络应用之间传递统一、安全的令牌信息。
你可以放在Cookie, 放在LocalStorage,只要和后端约定好,就OK
JWT的结构包括三个部分:
- Header: 包含令牌的类型和加密算法
- 比如:
{"alg":"HS256","typ":"JWT"}
- 比如:
Payload: 包含令牌的过期时间,用户信息等
- Signature: 核心部分, 通过把Header和Payload的Base64编码结果按加密算法进行加密得到
- 通常只有服务端会保存一个密钥,用于加密和解密Signature
当然,你看到的是Base64编码后的字符串,Base64不是加密,是可编码解码的,本质上还是明文
客户端收到JWT后,可以解析出Header和Payload,再次通过Header中的加密算法,对Header和Payload进行加密,得到新Signature,然后与收到的Signature进行对比,如果一致,则说明令牌合法,否则说明令牌被篡改。
思考:
- JWT是用来解决什么问题的?
- JWT的结构是什么样的?
- 请描述JWT的加密、解密和验证过程?