MyException - 我的异常网
当前位置:我的异常网» 软件架构设计 » 基于HMAC的rest api鉴权处置

基于HMAC的rest api鉴权处置

www.MyException.Cn  网友分享于:2013-01-17  浏览:0次
基于HMAC的rest api鉴权处理

一:常见的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使用说明请参见:使用说明

文章评论

Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
程序员和编码员之间的区别
程序员和编码员之间的区别
漫画:程序员的工作
漫画:程序员的工作
一个程序员的时间管理
一个程序员的时间管理
老程序员的下场
老程序员的下场
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
鲜为人知的编程真相
鲜为人知的编程真相
每天工作4小时的程序员
每天工作4小时的程序员
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
Java程序员必看电影
Java程序员必看电影
程序员的鄙视链
程序员的鄙视链
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序员应该关注的一些事儿
程序员应该关注的一些事儿
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员必看的十大电影
程序员必看的十大电影
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
我是如何打败拖延症的
我是如何打败拖延症的
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
编程语言是女人
编程语言是女人
旅行,写作,编程
旅行,写作,编程
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
那些争议最大的编程观点
那些争议最大的编程观点
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
代码女神横空出世
代码女神横空出世
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
总结2014中国互联网十大段子
总结2014中国互联网十大段子
我的丈夫是个程序员
我的丈夫是个程序员
中美印日四国程序员比较
中美印日四国程序员比较
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
10个调试和排错的小建议
10个调试和排错的小建议
 程序员的样子
程序员的样子
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有