加密/JWT-计网(4)

Date:

接上文,JWT是比较常用的解决登录认证问题的方式,JWT的结构是咋样的?安全嘛?


目录

加密算法

数据在网络中传输,需要加密,防止被窃取,篡改,常见的加密算法包括以下

  1. 对称加密
    • 核心思路:用同一个密钥,在发送端对明文数据进行加密得到密文,再在接收端对密文进行解密还原得到明文
    • 特点:加密解密速度快,适合大量数据加密
    • 缺点:因为要共享密钥,在网络中分发密钥时,泄露风险大
  2. 非对称加密
    • 核心思路:用一对密钥,一个公钥一个私钥,在发送端公钥加密,在接收端私钥解密
    • 特点:难破解
  3. 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进行对比,如果一致,则说明令牌合法,否则说明令牌被篡改。


思考:

  1. JWT是用来解决什么问题的?
  2. JWT的结构是什么样的?
  3. 请描述JWT的加密、解密和验证过程?