问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何实现RESTful Web API的身份验证

发布网友 发布时间:2022-04-25 07:01

我来回答

2个回答

热心网友 时间:2022-04-26 18:40

最近想拿一个小项目来试水RESTful Web
API,项目只有几个调用,比较简单,但同样需要身份验证,如果是传统的网站的话,那不用说,肯定是用户名+密码在登录页获得登录Token,并把登录
Token记在Cookie和Session中作为身份标识的这种方式,但现在不同了,关键是RESTful,这意味着我们设计出来的这些API是无状态
的(Stateless),下一次的调用请求和这一次的调用请求应该是完全无关的,也就是说,正宗的RESTful Web
API应该是每次调用都应该包含了完整的信息,没错,包括身份信息!

那如何确保安全?传输时给密码做MD5加密?得了吧!这样做只能让你自己感觉“安全”点,其实没什么任何用处,利用现在的技术(有种叫什么Rainbow Table啥的来着?本人外行,不是很懂)很快就能算出明文密码了,而且如何防止挟持和重发攻击?

也许你想到了,SSL,如果你打算采用SSL,请忘记一切自行设计的加密方案,因为SSL已经帮你做好了一切,包括防止监听,防止挟持,防止重发……一切都帮你考虑好了,你大胆地把明文密码写在你的包中就OK了,我向你保证没问题。

但SSL的缺点是服务器端配置相对有点复杂,更关键的就是客户端对此支持可能不好,那你考虑一种自己的加密方法,有木有?我这里提供一种方法,思路来自
于:http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-
authentication/,我只是把上面的内容中整理了一下变成了我的方法。(传说中的剽窃?呵呵)方法描述如下:

假设有一个用户,用户名是guogangj,密码是123456(呃……这也能叫密码?)
他要GET http://test.com/api/orders/
于是把 http://test.com/api/orders/这个URL和一个新生成的GUID拼在一起,再用123456这个密码执行对称加密,生成的密文为XXXXOOOOXXXXOOOO(假设而已)
数据包中带上用户名guogangj和XXXXOOOOXXXXOOOO这个密文,发送给服务器
服务器收到包后,根据guogangj这个用户名到数据库中查找到123456这个密码
服务器使用123456这个密码来解密XXXXOOOOXXXXOOOO这个密文,得到了明文,即http://test.com/api/orders/这个URL和前面由客户端生成的那个GUID
服务器到一个全局的集合中查找这个GUID,看看是否已经存在,如果存在,则验证不通过,如果不存在,就将其放入这个集合中。这是为了避免重发攻击。这个全局的集合会越来越大,所以还要定期清理。
服务器再比对解密出来的URL和用户真实请求的URL是否一致,如果一致,那么认为这是合法用户,验证通过!

这是大致过程,如果数据库里找不到该用户,或者解密错误,都被认为验证不通过。以下是一些改进:

数据库中的密码最好做一下摘要(MD5之类的),客户端对应地也要做一下。
在生成密文的时候可以考虑加入另外一些不希望被明文传输的敏感内容,甚至可以加入IP地址,并在服务器端验证。

非每次都要真正去数据库里拿一次用户信息,也许你有更好的办法,比如一个简单的缓存(不过需要处理缓存更新的问题),或者当你的系统大到一定程度的时候,
你考虑使用统一的服务来获取用户信息,这就不是缓存那么简单了,里面的文章很多,我相信现在大规模的门户网站都有自己的一套复杂的机制,所以表明上看
RESTful Web API很“低效”,但这种RESTFul的思路和模式却在实际中有很大的可塑性和威力。

这种方法应该足够安全了!

密码根本没有在网络上传输,密文采用的是非验证的对称加密,没有密钥就无法逆转,URL验证避免了传统的身份挟持攻击(即拦截一个用户的包并冒充此用户来访问其它的资源,即便无法破解用户密码), 再用GUID来避免了重发攻击,唯一需要担心的是用户泄露了自己的密码。

热心网友 时间:2022-04-26 19:58

REST 服务的安全,一般依赖于HTTP认证,

HTTP认证有几种:basic,digest,token,这些都有标准的实现的开源包

需要主要的是这个认证的帐号跟你业务的帐户实际是不一样的,

REST属于webService一种,他的安全是后台服务的安全,

因此不需要实际的业务帐号,通常是系统keyStore证书库里的账户.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
路由器网线一米多少钱 东芝电视怎么投屏安卓手机 东芝电视怎么投屏 东芝电视投屏功能在哪里 指甲根部半月白 ...在指甲中部黑线长起 还有就是月牙上有白色一块 都在同一个指_百度... 我农业银行五年定期无密码存款,身份证没了,仅凭身份证复印件和存款单... 混凝土强度回弹怎么测算推定值,是否满足要求?一篇文章讲明白_百度知 ... 发动机舱有胶皮味跟安装防盗器有关系吗 cb400f启动后有股胶皮味道 一个袋子装了半袋米,倒出三分之一多1千克后还剩19千克... 赓续用在什么地方 起名(五行生肖起名都可以) 赓续什么意思 庚续和赓续的意思是什么? 赓续与继续同意,作者为什么要用赓,不用继续,这广大人民群众好理解吗什么意_百度问一问 赓续 是什么意思 庚续与赓续的区别是什么? 赓续是什么意思 接续奋斗和赓续奋斗的区别 2018年生肖鼠、牛、虎的宝宝如何取名? 赓续和传承的区别是什么? 十二生肖的名字??? 怎么样按照生肖属相取名 继续与赓续一样吗 赓续跟继续有什么不同 赓续与继续的区别是什么? 还了得是什么意思 秋冬女生怎样穿搭才能显白呢? 女生冬天穿衣服颜色要怎么搭配,才能好看又显白你知道吗? 夏天以为显白的颜色,其实全是大坑,应该如何搭配呢? restful api 怎么进行身份验证 飞利浦电动牙刷hx6730的面板缝隙会漏水吗? 飞利浦HX6730/02 电动牙刷 怎么换刷头 飞利浦电动牙刷hx6730刷头和刷柄有没有缝隙 飞利浦电动牙刷6730能不能用9013刷头 为什么飞利浦HX6730的刷毛这么硬,是为了刷得更干净吗? 电动牙刷,飞利浦hx6730,但是刷完牙好像不是很干净还是有一层东西,是为什么? 网站后台删除友情链接出现:Call to a member function delete() on a non-object 数据库中查询到的resultset,如果有层级结构的,怎么转成有层级的json--java 如何用bat查看文件里是否有指定内容并移动。 乖乖女怎会喜欢男同性恋?是不是心理变态? 信用卡协商还款申请书怎么写?您好 公积金还款计划每年都要申请吗 电脑浏览器广告拦截权限 还款计划如何申请? 信用卡逾期了,到银行协商写了还款申请书,当时谈的时候让我写申请书... 怎么向银行申请还款计划书???跪求各位大侠帮帮忙了!!! 电脑怎么设置不让广告弹出窗口 电脑设置拦截广告 中国建设银行信用卡协商还款计划申请书的代理人是谁?