基于http协议的api接口对于客户端的身份认证方式以及安全措施

由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服务器并与客户端的cookie中的jsessionid关联起来,这样客户端再次访问我们就可以识别用户身份了。

但是对于api服务器,我们不能让访问者先登录再进行访问这样不安全,也不友好。所以一般情况我们都是需要客户端提供一个key(每个key跟用户是一对一关联的)来识别请求者的身份。

由HTTP协议进行通信的数据大都是未经加密的明文,包括请求参数、返回值、 cookie、 head等等数据,因此,外界通过对通信的监听,轻而易举便可根据请求和响应双方的格式,伪造请求与响应,修改和窃取各种信息。所以我们还需要对每次请求进行认证,来判断发起请求的是不是就是该用户,以及请求信息是否被篡改。一般采用对请求信息(请求uri,参数)进行摘要的方法来解决上述问题。由于摘要算法的不可逆性,因此这种方式能够在一定程度上防止信息被篡改,保障通信的安全。

1、MD5方式

用户需要先在网站上申请key、secret,然后校验流程如下:

客户端

  1.参数排序

  2.将参数串接起来加上secret,生成待摘要字符串

  3.使用MD5等摘要算法生成摘要串signature

  4.将key,signature放入header中一并传给服务器
服务器

  1.参数排序

  2.将参数串接起来加上secret(通过header中的key在数据库获取),生成待摘要字符串

  3.使用MD5等摘要算法生成摘要串

  4.服务端生成的摘要串与客户端通过header传递过来的摘要串进行比较

2、HmacSHA256方式

用户需要先在网站上申请key、secret,然后校验流程如下:

客户单

  1.将请求参数封装成json字符串,也就是请求体body

  2.使用HmacSHA256算法加secret对(请求url+nonce+body)加密生成摘要signature

  3.将key,signature放入header中一并传给服务器

服务器

  1.获取请求中的请求体body字符串

  2.使用HmacSHA256算法加secret(通过header中的key在数据库获取)对(请求url+nonce+body)加密生成摘要signature

  3.服务端生成的摘要串与客户端通过header传递过来的摘要串进行比较

注意使用HmacSHA256更加安全,而且我们可以直接将请求参数封装成json字符串放入请求体中(也就是通过io流)进行传递。

实际使用中遇到的问题:

1、带有下划线的header被过滤

当我们在使用HmacSHA256进行认证的时候,需要客户端将请求key,signature放入header,name设置为api_key,api_signature,这时出现一个问题是服务器怎么都获取不到这两个值,但是我在本机测试时没有问题的。后来才想起来是不是由于使用nginx做集群而部分头被过滤了,查看过后果然是nginx将带有下划线的header name过滤了,后来修改nginx配置便可以正常获取头信息。不过后来服务器使用了第三方的动态加速再次把带有下划线的header name给过滤了,为了避免麻烦索性修改程序将header name中的下划线都去掉了。

2、确保每次请求唯一性

由于http都是明文请求,虽然我们可以通过摘要进行一定的安全保证确保信息不被篡改,但是我们无法保证每次请求的唯一性,也就是如果请求数据被别人获取再次请求,此时也可能带来很严重的安全性问题。于是我们便需要用户在每次请求中设置一个递增的参数nonce,来确保每次请求都是唯一的。不过这样也可能带来一个问题,就是如果用户近乎同时发起两个请求a b,由于网络阻塞,可能后发起的b先到达服务器,这样当a达到的时候,服务器会认为a的nonce已过期请求非法而拒绝。为了解决这样的问题我们允许用户设置一个expire值来避免nonce认证带来的问题。

3、SNI

由于当时我们有不同的工程(不同的域名,跟不同的证书)位于同一台服务器,这样有的客户端访问我们api工程会抛异常,说http握手失败或者说请求域名与服务器证书不匹配而失败。所以我们需要客户端程序支持sni,它允许客户端在发起SSL握手请求时(具体说来,是客户端发出SSL请求中的ClientHello阶段),就提交请求的Host信息,使得服务器能够切换到正确的域并返回相应的证书。对于java语言来说jdk7的后续版本已经支持sni,或者使用httpclient 4.3及以后版本都可以很好的支持sni了。

转载于:https://www.cnblogs.com/lobby/p/5361820.html

基于http协议的api接口对于客户端的身份认证方式以及安全措施[转]相关推荐

  1. 基于http协议的api接口对于客户端的身份认证方式以及安全措施

    由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服 ...

  2. 基于Alios的后台API接口任务

    基于Alios的后台API接口任务 月初论文已经提交外审了,前两天接到一个任务是将之前开发的基于Alios的门禁系统接入到公司的新服务器中,后台程序由我来写,这对于我来说还是一个新的挑战. 周一 周一 ...

  3. 替代微信ipad协议的api接口

    安卓微信的api,个人微信开发API协议,微信 ipad sdk,微信ipad协议,微信web版接口api,微信网页版接口,微信电脑版sdk,微信开发sdk,微信开发API,微信协议,微信接口文档sd ...

  4. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(三)

    在前面两篇文章中,我介绍了基于IdentityServer4的一个Identity Service的实现,并且实现了一个Weather API和基于Ocelot的API网关,然后实现了通过Ocelot ...

  5. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权

    在上一讲中,我们已经完成了一个完整的案例,在这个案例中,我们可以通过Angular单页面应用(SPA)进行登录,然后通过后端的Ocelot API网关整合IdentityServer4完成身份认证.在 ...

  6. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)

    上文已经介绍了Identity Service的实现过程.今天我们继续,实现一个简单的Weather API和一个基于Ocelot的API网关. 回顾 <Angular SPA基于Ocelot ...

  7. 魔方APP项目-05-注册功能实现,手机号唯一验证接口、客户端进行手机号验证、保存用户注册信息接口、客户端用户进行注册、使用云通讯发送短信,服务端实现发送短信验证码的api接口、客户端实现点击发送短信

    用户模块 注册功能实现 1.手机号码唯一验证接口 在开发中,针对客户端提交的数据进行验证或提供模型数据转换格式成字典给客户端.可以使用Marshmallow模块来进行. 为了方便导包,所以我们设置当前 ...

  8. 基于SGIP协议编写短信网关接口

    通过不断的调试和沟通,短信功能终于好使了 为了让更多的人少走弯路,特将编写方法和注意事项记录下来,希望能够对大家有帮助: 短信网关的申请流程(此部分工作我们有专门的同事去搞定,我仅略知一二,仅供参考) ...

  9. 魔坊APP项目-21-种植园,宠物栏的功能实现、服务端提供显示宠物的api接口、客户端中展示宠物栏和宠物列表以及饱食度、宠物道具的使用

    种植园 一.宠物栏的功能实现 1. 宠物的显示 2. 宠物的使用 3. 宠物的饱食度 4. 宠物的开锁 1.服务端提供显示宠物的api接口 socket.py,代码 ... import math f ...

最新文章

  1. Git安装配置(Linux)
  2. 很久没有更新blog了,对不起每一位朋友。
  3. 用eclipse修改web工程的访问路径
  4. 如何制作流畅有力的游戏动画+Skullgirls案例分析
  5. Cloud Programming Simplified: A Berkerley View on Serverless Computing笔记
  6. colorkey唇釉是否安全_colorkey空气唇釉,19/支
  7. django配置在MySQL_怎么在Django中安装与配置mysql
  8. paip.python开发环境搭建
  9. linux dnf配置文件,RedHat8.1配置本地dnf源
  10. NUCLEO L476RG学习笔记(六)定时器中断
  11. 985高校计算机专业炉气分数,【原创】外地985高校专业录取分数解析(一)
  12. protected使用总结
  13. PMBOK第六版工具与技术:数据收集数据分析数据表现
  14. javascript 模拟退格键_js实现模拟计算器退格键删除文字效果的方法
  15. 如何使用预约旺进行免费的在线平台预约
  16. 认真CS☀️Unity中Newtonsoft.Json的使用
  17. 应届毕业第三年就升职360技术总监,总结3点晋升心得
  18. Java全套面试题及答案整理(2022版)
  19. 极通EWEBS 5.0盛装上市
  20. 使用R语言包clusterProfiler做KEGG富集分析时出现的错误及解决方法

热门文章

  1. 【分享】Web前端开发第三方插件大全
  2. github和gitlab仓库一起使用
  3. [小北De编程手记] : Lesson 02 - Selenium For C# 之 核心对象
  4. USE平台构件属性无法显示的一种解决办法
  5. EBS中Java并发程序笔记(1)
  6. 博文视点 OpenParty第11期:世界黑客大会那些事
  7. Ruby on Rails 通过代理远程安装
  8. 18函数对象19command模式20函数对象在STL中的应用
  9. 计算机应用基础126题,2015-2016年全国计算机应用基础总复习.
  10. 数据结构——链式队列解析(C语言版)