Restful HMAC认证

我们在设计REST(Representational State Transfer)风格的Web service API,有一个问题经常要考虑,就是如何设计用户认证的体系(Authentication). 

比较传统的做法是首先有一个登陆的API,然后服务器返回一个session ID,后续的操作客户端都必须带上这个session ID,但是这样的,服务就变成了有状态了,不符合REST风格的原则。另外,由于负载均衡的存在,必须有公共存储来保存用户的Session,这也增加了系统的复杂度。 

所以比较好的做法是每次都传递认证信息,这样系统就是无状态的,当然由于每次都需要认证,必然降低了一些效率,必要的时候要考虑缓存用户信息在服务器端。 

有几点要注意: 

1.密码不能传播 

一个比较低级的错误是通讯时,由客户端传递用户名和密码到服务器端认证,这样很容易被黑客攻击造成密码泄露。 

标准的做法是使用HMAC(Hash-based Message Authentication Code),想法就是不传播password,而传播content和password的混合hash值。我们来看看Amazon S3怎么做认证的。 

Amazon对每一个用户有一个AWSAccessKeyId和一个AWSSecretAccessKey,每次HTTP请求需要一个Id和一个Autherticantion信息。 比如: 

GET /photos/puppy.jpg HTTP/1.1 
Host: johnsmith.s3.amazonaws.com 
Date: Tue, 27 Mar 2007 19:36:42 +0000 Authorization: AWS 0PN5J17HBGZHT7JJ3X82: xXjDGYUmKxnwqr5KXNPGldn5LbA= 
这个Authorization的头是这样产生的: 其中YourSecretAccessKeyID用的就是AWSSecretAccessKey。 
Authorization = "AWS" + " " + AWSAccessKeyId + ":" + Signature; 
Signature = Base64( HMAC-SHA1( UTF-8-Encoding-Of( YourSecretAccessKeyID, StringToSign ) ) ); StringToSign = HTTP-Verb + "\n" + 
Content-MD5 + "\n" + 
Content-Type + "\n" + 
Date + "\n" + 
CanonicalizedAmzHeaders + 
CanonicalizedResource; CanonicalizedResource = [ "/" + Bucket ] + 
<HTTP-Request-URI, from the protocol name up to the query string> + 
[ sub-resource, if present. For example "?acl", "?location", "?logging", or "?torrent"]; 
CanonicalizedAmzHeaders = <described below> 

这样服务端就很容易根据用户信息来验证信息的正确与否。 

  1. 验证信息的位置 

验证信息可以放在HTTP HEADER里面也可以放在HTTP URL里面,象这样: 

GET /photos/puppy.jpg?AWSAccessKeyId=0PN5J17HBGZHT7JJ3X82&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D HTTP/1.1 
Host: johnsmith.s3.amazonaws.com 
Date: Mon, 26 Mar 2007 19:37:58 +0000 

放在HTTP HEADER里面的好处是URL比较干净整洁,适合放在internet与人分享,而放在URL里面则有利于发布私有的访问权限给第三方。 

  1. 如何防范重放攻击(Replay attack)? 

理论上,黑客可以窃取你的通讯报文,然后重新发送来通过认证。有几种可能的solution. 

  1. 客户端所以向服务器申请一个随机数,然后这个随机数作为下次通讯的key,一旦使用过后就立即失效,也就是所谓的”一次一密”。这种方法的好处是很安全,但是增加通讯量,而且由于负载均衡的存在,必须有公共存贮保存这个key。 

b.服务器端保存使用过的authertication信息,只要是使用过的就拒绝再次使用。这种方法不需要客户端支持,但是需要公共空间来保持历史记录。 

c.使用时间戳。做法就是认证信息中含有时间信息,这样服务器端就可以拒绝时间相隔太长的请求,认为其已经过期。这种做法需要服务器端和客户端有某种形式的时间同步。 

4.要不要使用HTTPS? 

如果安全度要求很高或者是针对internet的API,无疑应该使用HTTPS,来避免内容被窃取的可能。 

如果只是在局域网范围或者可信赖的计算环境,则使用HTTP来提高一点效率。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 打包_Springboot2.0学习11 使用maven插件打包docker部署应用

一、本文目标使用Maven插件构建SpringBoot应用的docker镜像镜像推送至Docker Registry启动容器本文开发环境 &#xff1a;jdk1.8mavenideaSpringBoot2.2本文使用 com.spotify 的 docker-maven-plugin插件执行docker命令。据说官方不再推荐使用该插件&#xff0c;而是使用 docke…

[转帖]Mootools源码分析-49 -- Asset

原帖地址&#xff1a;http://space.flash8.net/space/?uid-18713-action-viewspace-itemid-410355 原作者&#xff1a;我佛山人 代码 //脚本,样式和图片的资源加载varAsset newHash({ //脚本资源的加载javascrīpt: function(source, properties) { //合并属性项…

桌面壁纸大全:50套高清 Mac 桌面壁纸背景【下篇】

这篇文章收集一组非常精美的 Mac 高清桌面壁纸分享给大家&#xff0c;这些都是仔细挑选的完美图片。挑选一张自己最喜欢的 Mac 高清桌面壁纸给你的电脑换上&#xff0c;让你的电脑看起来与众不同。 您可能还喜欢 分享18套精美的苹果风格免费图标素材10套精美的免费网站后台管理…

SpeedyCloud研发总监李孟:不要让底层细节被上层打败

随着互联网的发展&#xff0c;对于现代企业来说&#xff0c;DNS与CDN服务的作用正变得愈发重要&#xff0c;网络访问速度决定了前端客户体验&#xff0c;同时也影响着内部业务系统的运行。SpeedyCloud作为一家新晋IaaS云服务供应商&#xff0c;在DNS与CDN方面同样拥有丰富的实践…

springboot 关闭懒加载_SpringBoot新手入门篇

SpringBoot是干哈的介绍&#xff1a;springboot是由Pivotal团队提供的全新框架。spring的出现是为了解决企业级开发应用的复杂性&#xff0c;spring的通过注册bean的方式来管理类&#xff0c;但是随着业务的增加&#xff0c;使用xml配置bean的方式也显得相当繁琐&#xff0c;所…

NodeManager启动流程与服务

本文介绍了NodeManager的启动流程与服务. NodeManager主流程 在main方法中new一个 NodeManager, 然后初始化并启动. 这里主要看initAndStartNodeManager方法. 首先是增加一个shutDownHook, 即CompositeServiceShutdownHook, 它的目的是为了在NodeManager crash的时候停止compos…

Unity3D的断点调试功能

&#xfeff;&#xfeff;这篇文章介绍的调试工具是Unity自带的MonoDevelop, 假设要用VS&#xff0c;须要下载unityvs http://unityvs.com/. http://liweizhaolili.blog.163.com/blog/static/162307442013214485190/ 断点调试功能可谓是程序猿必备的功能了。Unity3D支持编写js…

python中if else语句用法_Python中if-else语句的多种写法

原博文 2017-02-06 10:24 − 初学Python在看程序时发现python中if-else的多种写法&#xff0c;故对其进行分析。 以下为网络内容&#xff1a; a, b, c 1, 2, 3 1.常规 if a>b: &nb... 相关推荐 2019-11-13 15:13 − if x A: do something for A elif x B: do somethi…

Reflux系列01:异步操作经验小结

写在前面 在实际项目中&#xff0c;应用往往充斥着大量的异步操作&#xff0c;如ajax请求&#xff0c;定时器等。一旦应用涉及异步操作&#xff0c;代码便会变得复杂起来。在flux体系中&#xff0c;让人困惑的往往有几点&#xff1a; 异步操作应该在actions还是store中进行&…

python转换成c语言_把python转成c

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; 推荐使用腾讯云 api 配套的7种常见的编程语言 sdk&#xff0c;已经封装了签名和请求过程&#xff0c;均已开…

python逐行写入csv_python将列表按行写入csv

原博文 2020-05-14 13:17 − import csv rows2 [abc1/ab1c,N] for n in range(10): f open("ok.csv", a,newline) writer csv.writer(f) writer.writerow(rows2) f.cl...02349 相关推荐 2019-12-18 14:42 − 逗号分隔值&#xff08;Comma-Separated Values&#x…

第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动 8

这个方法所做的事情就是:446行: 首先通过Device类的executeShellCommand方法发送类似”adb shell getprop”的命令去获得所有支持的系统属性&#xff0c;这个方法最终调用的是AdbHelper类的executeShellCommand方法&#xff0c;它会接收一个专门用来对指定shell命令如getprop的…

新手买车的九大原则

汽车俨然已经成为了人们生活中不可缺少的助手。放眼市场&#xff0c;汽车的品牌、车型、颜色、配置&#xff0c;划分的类别太多太多&#xff0c;让众多爱车友人在购车时眼花缭乱。由于厂家、商家片面的宣传和误导以及购车者思想上或这样或那样的误区&#xff0c;使众人面对购车…

python实现链表的删除_Python垃圾回收机制

python作为一门解释型语言&#xff0c;以代码简洁易懂著称。我们可以直接对名称赋值&#xff0c;而不必声明类型。名称类型的确定、内存空间的分配与释放都是由python解释器在运行时进行的。python这一自动管理内存功能极大的减小了程序员负担,这也是成就python自身的重要原因之…

第一章:The Missing Code Library--2.合法化输入

合法化输入&#xff1a;只允许数字和字母 用户常常会忽略掉说明&#xff0c;并且输入错误的数据。作为一个Shell脚本开发人员&#xff0c;你需要拦截并纠正这些错误。 典型情况是&#xff0c;你或许会遇见文件名或是数据库的键。你提示用户要输入一个全部由大小写字母和数字…

java 缓存清理echo_“kill -9”一时爽,秋后算账泪两行

原创&#xff1a;小姐姐味道(微信公众号ID&#xff1a;xjjdog)&#xff0c;欢迎分享&#xff0c;转载请保留出处。任何不保留此声明的转载都是抄袭。kill是杀死的意思&#xff0c;带有主动的意味。鉴于master、slave这样的名词&#xff0c;需要在计算机软件中进行整改&#xff…

解决stackoverflow打开慢不能注册登录

http://blog.csdn.net/dream_an/article/details/50280977 解决stackoverflow打开慢不能注册登录 标签&#xff1a; stack overflowfirefox扩展打不开 2015-12-13 09:16 131人阅读 评论(2) 收藏 举报 分类&#xff1a;综合&#xff08;6&#xff09; 作者同类文章X版权声明&a…

halcon 旋转_HALCON高级篇:3D相机标定(3/3)

访问标定结果算子calibrate_cameras的主要结果由相机内参和每一张图像标定板的位姿组成。算子将它们存储在标定数据模型中&#xff0c;可以用算子get_calib_data来访问它们。相机外参并不能直接被获取&#xff0c;因为所需的世界坐标系统的信息没有存储在标定数据模型中。然而&…

什么叫n+1次select查询问题?

在Session的缓存中存放的是相互关联的对象图。默认情况下&#xff0c;当Hibernate从数据库中加载Customer对象时&#xff0c;会同时加载所有关联的Order对象。以Customer和Order类为例&#xff0c;假定ORDERS表的CUSTOMER_ID外键允许为null&#xff0c;图1列出了CUSTOMERS表和O…

OGRE 入门 二、Basic Tutorial 1 : An introduction to the most basic Ogre constructs

1. 下载源代码及脚本 这里有一个‘Convenient All-In-One’ 版的框架。 2. 创建场景 解压clean_ogre_cmake_project.zip&#xff0c;修改TutorialApplication.cpp中的函数&#xff1a; 1 void TutorialApplication::createScene(void)2 {3 // create your scene here :)4 …