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

基于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://www.mzph.cn/news/285168.shtml

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

相关文章

使用 Scrutor 快速实现“装饰者模式”

装饰者模式介绍装饰器模式(Decorator Pattern)是在不改变原类和使用继承的情况下,动态地给一个对象添加一些额外的职责。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。可以在如下使用场景中使用装饰器模式:在…

各个 Android Gradle 插件版本所需的 Gradle 版本

下表列出了各个 Android Gradle 插件版本所需的 Gradle 版本。 要获得最佳性能,您应该使用 Gradle 和插件这两者的最新版本。 插件版本所需的 Gradle 版本1.0.0 - 1.1.32.2.1 - 2.31.2.0 - 1.3.12.2.1 - 2.91.5.02.2.1 - 2.132.0.0 - 2.1.22.10 - 2.132.1.3 - 2.2…

JS时间戳和时间互转

https://www.cnblogs.com/nield-bky/p/6040853.html http://blog.csdn.net/csdn565973850/article/details/73838583 时间转时间戳: javascript获得时间戳的方法有四种,都是通过实例化时间对象 new Date() 来进一步获取当前的时间戳1.var timestamp1 Da…

C语言试题157之从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。 输入的字符串以!结束

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:从键盘输入一个字符串,将小…

【ArcGIS微课1000例】0001:添加XY数据(Add XY data)生成shp

用过CASS的人都知道,野外数字测图得到的点数据(平面坐标)可以直接在CASS中展点,进一步绘制地形图。那么,带有坐标的数据能不能在ArcGIS中实现点图层的生成呢?答案是必须的! 本文以气象台站Excel…

算法导论--广度优先搜索和深度优先搜索

广度优先搜索 在给定图G(V,E)和一个特定的源顶点s的情况下,广度优先搜索系统地探索G中的边,以期“发现”可从s 到达的所有顶点,并计算s 到所有这些可达顶点之间的距离(即最少的边数)。该搜索算法同时还能生成一棵根为s…

动手学 docker

背景动手学 docker最近,终于完成了 动手学 docker 系列的编写。动手学 docker 是 动手学系列 的首个系列。如果反馈的效果不错,后续还将推出 动手学 devops动手学 kubernetes动手学 istio 等系列。动手学系列 的构思来源于 李沐 老师的 动手学深度学习 。…

Linux零基础入学之1-1课程介绍了解RHEL7安装RHEL7

【本节内容】* 课程介绍* RHEL7了解* RHEL7.2的安装* 实战:组装服务器【Linux介绍】服务器种类:刀片式、塔式(机架式)1U:4.45cm 三指宽 指服务器的高度贝尔实验室 Unix 肯汤普森 & 丹尼斯里奇二人合作用…

【ArcGIS微课1000例】0003:按属性选择(Select by Attributes)

在使用ArcGIS时,可以使用 SQL 表达式基于要素属性来选择要素。 通过按属性选择 对话框可为 SQL 表达式定义一个或多个由属性、运算符和计算构成的条件。给定图层上生成的要素选择内容满足这些条件。 文章目录 按属性选择工具1. 工具箱→按属性选择图层2. 菜单栏→按属性选择3.…

[转]Android 常见安全漏洞修复理论与实践

前言 前段时间公司对应用在爱加密上进行了安全扫描,本文将基于爱加密的漏洞分析报告,针对部分内容,介绍理论修复实践 最小化特权准则概念介绍 最小化特权准则,即指组件只能供自身应用调用,尽可能禁止其他应用访问及…

C语言试题158之从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:从键盘输入一些字符,逐个把…

html5--3.2 input元素(1)

html5--3.2 input元素(1) 学习要点 input元素及其属性input元素 用来设置表单中的内容项,比如输入内容的文本框,按钮等不仅可以布置在表单中,也可以在表单之外的元素使用input元素的属性 type属性:指定输入内容的类型,…

css3 3D

● css3 3D旋转 ○ rotateX() 方法,元素围绕其 X 轴以给定的度数进行旋转 ○ rotateY() 方法,元素围绕其 Y 轴以给定的度数进行旋转 ○ rotateZ(angle),定义沿 Z 轴的 3D 旋转。 ● 3D景深 ○ perspective(n),景深,离屏…

我是怎么自学 Git / GitHub 的?

大家好我是鱼皮,Git 和 GitHub 是如今团队协作开发必不可少的技能,且不说程序员,就连很多产品也在学习它们。今天分享一下我自学 Git 和 GitHub 的经验,希望起到一个 导学 的作用,帮助大家抓住重点,节省时间…

[转]Android 代码混淆和加固 so库 简单教你一行代码实现

混淆 因为开启混淆会使编译时间变长,所以debug模式下不开启。我们需要做的是: 1.将release下minifyEnabled的值改为true,打开混淆; 2.buildConfigField 不显示log日志 为什么要混淆: 优化java的字节码减小apk文件的大…

【ArcGIS微课1000例】0004:值提取至点(Extract value to point)

文章目录 问题描述值提取至点工具介绍案例实现过程注意事项问题描述 研究区分布有成千上万个离散的矢量点(根据范围创建随机点),但是点上没有高程值,研究区DEM是有的,那么怎样在ArcGIS中提取每个点对应的高程值? 离散点分布情况: DEM数据(ArcGlobe中三维显示):

C语言试题159之计算字符串中子串出现的次数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:两个字符串连接程序 2 、温馨…

关于Android studio找不到sqlite数据库的解决方法

打开Android Device Monitor,剩下的与Eclipse相同。转载于:https://blog.51cto.com/10237758/1761397

linux ubuntu deepin apache2 rewrite

2019独角兽企业重金招聘Python工程师标准>>> apache php 环境装好了,下载了TP5的项目,然后部署上去之后,端口81,,但是 访问 127.0.0.1:81 正常 127.0.0.1:81/admin,报错 404 Not Found 原因是,…

论DATASNAP远程方法支持自定义对象作参数

论DATASNAP远程方法支持自定义对象作参数 DATASNAP远程方法已经可以支持自定义对象作参数,这是非常方便的功能。 1)自定义对象 type TMyInfo class(TObject) public AccountNo: string; SQL: string; Params: string; end; 2)远程方法定义 f…