基于HMAC的rest api鉴权处理_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 基于HMAC的rest api鉴权处理

基于HMAC的rest api鉴权处理

 2018/1/6 21:16:21  wj596  程序员俱乐部  我要评论(0)
  • 摘要:一:常见的HTTP鉴权协议REST表述性状态转移(RepresentationalStateTransfer),是基于HTTP的web服务设计风格,一个RESTFULAPI是无状态的,这意味着认证请求应当不能依赖于cookie或session。常见的HTTP鉴权方法有:HTTPBASIC将用户信息以base64编码放入header中,后端直接从header中取出Authorization,然后进行base解码。在不使用HTTPS协议的情况?,安全性很低
  • 标签:API Mac

一:常见的HTTP鉴权协议

??????? REST表述性状态转移(Representational State Transfer),是基于HTTP的web服务设计风格,一个 RESTFUL API 是无状态的,这意味着认证请求应当不能依赖于cookie或session。

??????? 常见的HTTP鉴权方法有:

??????? HTTP BASIC

??????? 将用户信息以base64编码放入header中,后端直接从header中取出Authorization,然后进行base解码。在不使用HTTPS协议的情况?,安全性很低。

HTTP BASIC认证的编码实现

??????? HTTP DIGEST

??????? 客户端先发送一次请求,服务端认证失败返回401并附加一个唯一性的nonce编码,客户端收到401信息,将nonce编码,用户信息,请求参数生成摘要(通常为MD5)信息,客户端附带摘要信息,再次发送请求。

认证是失败服务端返回 消息摘要后第二次请求报文

??????? 安全性比HTTP BASIC高,由于nonce编码的唯一性可以防止重放攻击。但是客户端需要发送两次请求,而且每种web服务器和客户端环境对HTTP DIGEST的支持方式和支持程度不一致。

? ? ? ? OAUTH2

??????? 更关注授权操作,而不是鉴权。更多使用与第三方授权,比如通过QQ用户信息更登陆简书就可以使用OAUTH2协议。常用的鉴权框架spring security、shiro都支持这种协议的集成。

二:API ID+HMAC鉴权方式

??????? 1、appId:是用于确定客户端的唯一性标示符。

??????? 2、HMAC :是基于散列的消息认证码(Hash-based MessageAuthentication Code)。

HMAMD5摘要生成

??????? 3、appKey: 秘钥,用于HMAC算法生成数字摘要,秘钥由服务端生成,一个appId对应一个秘钥。

??????? 4、客户端持有API ID和APP KEY

??????? 5、每次请求前,将请求参数的名称按照自然顺序进行排序,然后依次取出这些参数的值进行连接字符串操作生成baseString,将appId,timestamp(当前时间戳精度为毫秒)也连接到baseString后面。使用HMAC摘要算法和秘钥APP KEY生成数组摘要digest。

? ? ? ? 6:客户端发送请求时将apiId、timestamp、digest三个参数带着,如GET方式的请求:parameter1=p1&parameter2=p2&apiId=API KEY&digest=digest&timestamp=timestamp。如果您想要参数不可见可以使用AES进行加密传输。

? ? ? 7:服务端验证,首先要求apiId、digest、timestamp三个参数不能为空,然后用和客户端生成摘要相同的步骤生成服务端摘要,与客户端传入的摘要相比较,并从数据库已使用过的摘要,检查此摘要是否是使用过的,两个摘要比对进行验签,验签成功后将摘要存入已用摘要表。

服务端认证代码 ?

三、小结

这种鉴权处理方式的特点:

1、不在网络上传递用户口令。

2、请求参数进行加密传输,防止敏感信息外泄。

3、采用HMAC摘要防篡改。

4、摘要中加入时间戳,每个摘要只允许使用一次,防止重放攻击。

?

?

jsets-shiro-spring-boot-starter中封装了HMAC的鉴权,请参见:

项目文档、源码

项目中经常用到的功能比如:验证码、密码错误次数限制、账号唯一用户登陆、动态URL过滤规则、无状态鉴权等等jsets-shiro-spring-boot-starter对这些常用的功能进行了封装和自动导入,少量的配置就可以应用在项目中。

1、jsets-shiro-spring-boot-starter项目详情请参见:jsets-shiro-spring-boot-starter

2、应用示例源码请参见:jsets-shiro-demo

3、jsets-shiro-spring-boot-starter使用说明请参见:使用说明

上一篇: shiro jwt 构建无状态分布式鉴权体系 下一篇: 没有下一篇了!
发表评论
用户名: 匿名