prerequisite: 什么是JWT?
JWT适用场景
- 用户登录:用户通过密码换取jwt,后续使用jwt继续交互,以实现一次登录访问全部资源的目的。
- 简单实体认证:由服务方直接分发一个生成的jwt给使用方,使用方每次使用jwt方位服务的接口。这种方式长用户接口之间的实体认证,但安全性较弱,因为其他方如果获知了jwt token,也依然能够通过该token访问接口。
HMAC(AK/SK)
简单介绍一下HMAC
HMAC(Hash-based Message Authentic Code),即基于hash的消息认证码,它使用哈希算法,以一个密钥和一个消息作为输入,生成一个消息摘要作为输出,服务端通过对比发送的摘要和自己生成的摘要是否相同完成认证。
HMAC(AK/SK) HMAC预先生成一个access key(AK)和secure key(SK),然后客户端通过使用AK和SK以及可能存在的偏移量iv对一段消息文本进行签名,客户端发送AK和签名,服务端使用AK和SK以及偏移量iv重新签名,通过对比两个签名是否一致的方式完成认证请求。这种方式避免传输secure key,且大多数情况下只允许使用一次,避免了重放攻击。
JWT和HMAC的区别
- HMAC服务端不仅有一个密钥,同时每一个调用实体都分发一个appid(AK)
- 用来签名的数据可以由调用双方约定,简单可以使用字符串,也可以使用map、array等其他数据类型
- 签名过程可以带上时间戳,这样每次调用的签名都不一样,安全性高
- 签名是根据约定好的算法进行计算,不需要客户端获取token之后一直传递token,但每次调用都要进行签名,没有jwt计算轻量。
HMAC
适合api之间相互调用的认证
JWT使用HMAC签名
事实上两种方式经常结合使用,因为jwt的签名过程本质上和HMAC一样,都是进行一次hash计算。
方式一:jwt的签名过程中使用HMAC加密算法,后续持续使用token鉴权(token具有时效性,可以短时间内持续有效),这样既保证了安全,也不会有每调用一次就需要重新签名这样重复的计算量。
方式二:获取jwt签名后的token之后,在使用HMAC算法对该token进行签名,这样可以实现跨系统调用。
参考文献
- HMAC算法原理
- JWT和HMAC(AK/SK)认证方式使用场景