对称加密
单个密钥,服务端与客户端同时持有,一方发送使用密钥加密的数据,另一方用相同的密钥进行解密
常见算法: AES,DES,SM4
优点: 加密解密速度快,适合大量数据加密,密钥短,计算开销低
缺点:
- 密钥分发困难(如何安全分发)
- 每对通信方需要唯一密钥,n 个人两两通信需要 n(n-1)/2 个密钥
典型用途: HTTPS的实际数据加密(TLS握手之后用得到的密钥对实际要传递数据进行加密) ; 文件加密 ; 数据库字段加密
非对称加密
一对密钥,分为公钥和私钥
用法:
- 数据加密: 公钥对数据进行加密,私钥对数据进行解密
- 数字签名: 私钥对数据进行加密,公钥来对加密的数据进行验证
常见算法: RSA,ECC,SM2
优点: 解决了密钥分发问题,公钥可公开,密钥无需传给别人 ; 可实现数字签名 ; n个人两两通信只需要2n个密钥(因为公钥是可公开的)
缺点: 加密解密速度慢(比对称加密慢几百上千倍) ; 密钥长度长,计算开销大,不适合加密大量数据,一般只用于身份验证
应用: HTTPS握手阶段(交换对称密钥), SSH登录, 数字证书, 加密货币
JWT
JWT(Json Web Token)本质上是一种加密信息格式
包括三部分,用.分隔
Header(头部)
包括令牌类型(typ,通常为JWT)和签名算法(alg,如HS256)
例如{"alg": "HS256", "typ": "JWT"}
然后对他进行Base64加密得到第一部分
Payload(载荷)
包含声明,有三类声明:
- 注册声明: iss签发者,exp过期时间(是一个时间戳,表示在这个时间点之后过期) ,sub主题等
- 公共声明: 自定义声明,为了避免冲突需要再IANA注册或使用URI
- 私有声明 : 自己要传递的信息,id,role等
示例: {"sub": "123456","name":John,"id":"20222151"}
然后同样进行Base64编码得到第二部分
Signature(签名)
对Header.Payload整体使用指定算法和密钥进行加密(注意对称加密和非对称加密均可)
加密结果也进行base64编码得到第三部分签名
使用
三部分组成一个格式为Header.Payload.Signature的token,其中Header和Payload都只用base64编码即都是明文,客户端直接解码拿Payload中的自己要用的信息就行了,然后发请求的时候把token原封不动的发回服务端,服务端对token解密进行验证即可
解密如果解不出来或者解密发现信息被篡改了那就是token验证错误,如果正常解密出来了但发现时间已经过了设定的时间戳了那就是token过期
由于加密和解密都是在服务端进行的,客户端无需解密,所以一般只需要对称加密一个密钥即可
特殊情况下认证服务(签发JWT)和资源服务(处理业务请求,需要验证token)是分开的话,那假如用对称加密那每一个资源服务都持有私钥,太危险,可以使用非对称加密,认证服务持有私钥,资源服务持有公钥即可
数字证书原理
数字证书包含主体信息和一个数字签名
数字签名是先对主体信息进行哈希(哈希函数是不可逆的,因为哈希进行的过程会丢失大量的信息)
然后再对这个哈希值用私钥加密得到数字签名,然后把主体信息和数字签名组成数字证书
客户端验证的时候先用公钥解密数字签名得到原始哈希值,然后用相同的哈希算法计算主体信息把得到的哈希值与刚解密得到的哈希值进行比对验证数字证书是否被篡改