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了。

时间: 2024-12-21 05:21:06

api接口对于客户端的身份认证方式以及安全措施的相关文章

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

基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服务器并与客户端的cookie中的jsessionid关联起来,这样客户端再次访问我们就可以识别用户身份了. 但是对于api服务器,我们不能让访问者先登录再进行访问这样不安全,也不友好.所以一般情况我们都是需要客户端提供一个key(每个

SQL2008 SQL Server身份认证方式登录失败(错误18456)笔记

1 安装小结 今天换了电脑,很多软件都得重装,期间报了很多问题,比如说先装vs2008再装sql server2008r2会报一个“存在2008早期版本”,通过查找,百度一系列的坑爹之路后,我还是把vs2008卸载后再安装了sql server 2008r2,而且因为最先装的是vs2012,在运行时会停止工作,所以一再尝试过后,推荐的顺序为sql server 2008r2,vs2008,vs2012. 2  sql server无法用sql server身份验证 一切准备就绪的时候,我点击了s

RESTful Api 身份认证安全性设计

REST是一种软件架构风格.RESTful Api 是基于 HTTP 协议的 Api,是无状态传输.它的核心是将所有的 Api 都理解为一个网络资源.将所有的客户端和服务器的状态转移(动作)封装到 HTTP 请求的 Method  之中. 详情可以阅读 http://mengkang.net/620.html . 而这篇文章则主要是讨论 RESTful Api 身份认证安全性设计. 没有绝对的安全,这个话题很深, 下文都是自己的一些理解,水平有限,如有勘误,希望大家予以指正. 由于 RESTfu

.NetCore采取JWT方式进行身份认证

验证与授权 Authentication(身份认证) 认证是系统对请求的用户进行身份识别的过程. Authorization (授权) 授权是对认证通过后的用户进行权限分配的过程.授权简单理解就是:识别认证后用户所拥有哪些权限,从而开放服务器相对应的资源: 我们通俗点来解释身份验证与授权:验证确认用户是否允许访问,授权给予登录后的用户指定权限标识(通过这个标识,服务端可允许用户进行访问和操作): 在进行讲解Jwt身份认证前我们来回一下过去我们在MVC.WebForm这些站点都是怎样进行身份认证的

Java 实现 SSH 协议的客户端登录认证方式--转载

背景 在开篇之前,让我们先对 SSH 协议有个宏观的大致了解,这样更有利于我们对本文的加深了解.首先要提到的就是计算机网络协议,所谓计算机网络协议,简单的说就是定义了一套标准和规则,使得不同计算机之间能够进行正常的网络通信,不至于出现在一台机器上发出的指令到另一台机器上成了不可认的乱码,SSH 就是众多协议的其中之一.经典的七层 OSI 模型(Open System Interconnection Reference Model)出现后,大大地解决了网络互联的兼容性问题,它将网络划分成服务.接口

基于token的多平台身份认证架构设计

基于token的多平台身份认证架构设计 1   概述 在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情. 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格局 . 不同的客户端产生了不同的用户使用场景,这些场景: 有不同的环境安全威胁 不同的会话生存周期 不同的用户权限控制体系 不同级别的接口调用方式 综上所述,它们的身份认证方式也存在一定的区别. 本文将使用一定的篇幅对这些场景进行一些分析和梳理工作. 2   使用场景 下面是一些在IT服务常见的一些

基于STS和JWT的微服务身份认证

自 Martin Fowler 提出微服务架构的概念后,这个名词就一直比较流行,总是成为众多技术论坛和公众号的讨论热点.很多互联网和软件公司都在将原有的整体架构进行拆分,朝着微服务架构的方向进行迭代,而新的项目也几乎无一例外的成为了实践微服务架构的场所. 对于大多数有经验的工程师来说,将传统的异步函数调用直接改成 REST API 或者某种 RPC 并不是一件很困难的事,要面临的问题包括序列化,调用延时和版本等. 但服务接口之间的安全和身份认证(Authentication)问题往往比较棘手,而

细说ASP.NET Forms身份认证

用户登录是个很常见的业务需求,在ASP.NET中,这个过程被称为身份认证. 由于很常见,因此,我认为把这块内容整理出来,与大家分享应该是件有意义的事. 在开发ASP.NET项目中,我们最常用的是Forms认证,也叫[表单认证]. 这种认证方式既可以用于局域网环境,也可用于互联网环境,因此,它有着非常广泛的使用. 这篇博客主要讨论的话题是:ASP.NET Forms 身份认证. 有一点我要申明一下:在这篇博客中,不会涉及ASP.NET的登录系列控件以及membership的相关话题, 我只想用比较

细说ASP.NET Windows身份认证

上篇博客我谈到了一些关于ASP.NET Forms身份认证方面的话题,这次的博客将主要介绍ASP.NET Windows身份认证. Forms身份认证虽然使用广泛,不过,如果是在 Windows Active Directory 的环境中使用ASP.NET, 那么使用Windows身份认证也会比较方便. 方便性表现为:我们不用再设计登录页面,不用编写登录验证逻辑.而且使用Windows身份认证会有更好的安全保障. 回到顶部 认识ASP.NET Windows身份认证 要使用Windows身份认证