(转)基于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了。
(转)基于http协议的api接口对于客户端的身份认证方式以及安全措施的更多相关文章
- 基于http协议的api接口对于客户端的身份认证方式以及安全措施
由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服 ...
- api接口对于客户端的身份认证方式以及安全措施
转载 基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsession ...
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(三)
在前面两篇文章中,我介绍了基于IdentityServer4的一个Identity Service的实现,并且实现了一个Weather API和基于Ocelot的API网关,然后实现了通过Ocelot ...
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(四)
在上一讲中,我们已经完成了一个完整的案例,在这个案例中,我们可以通过Angular单页面应用(SPA)进行登录,然后通过后端的Ocelot API网关整合IdentityServer4完成身份认证.在 ...
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)
上文已经介绍了Identity Service的实现过程.今天我们继续,实现一个简单的Weather API和一个基于Ocelot的API网关. 回顾 <Angular SPA基于Ocelot ...
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(一)
好吧,这个题目我也想了很久,不知道如何用最简单的几个字来概括这篇文章,原本打算取名<Angular单页面应用基于Ocelot API网关与IdentityServer4+ASP.NET Iden ...
- 简单说基于JWT和appkey、sercurtyKey的SSO、身份认证方案
环境介绍, 一个大的系统由多个子系统组成.典型地,假设有一个平台,其上接入了多个应用.则有几个常见的问题需要处理, 1.SSO(包括单个应用退出时,需要处理为整个系统退出): 2.平台跳转到应用.及应 ...
- ASP.NET Web API教程(六) 安全与身份认证
在实际的项目应用中,很多时候都需要保证数据的安全和可靠,如何来保证数据的安全呢?做法有很多,最常见的就是进行身份验证.验证通过,根据验证过的身份给与对应访问权限.同在Web Api中如何实现身份认证呢 ...
- {网络编程}和{多线程}应用:基于TCP协议【实现多个客户端发送文件给一个服务器端】--练习
要求: 实现多个客户端发送文件给一个服务器端 提示:多个人创建客户端发送文件,服务端循环接收socket,从socket中获取文件 说明:这里我们只要建立一个服务端就可以了,然后让多台电脑使用客户端给 ...
随机推荐
- C# Note4:XML序列化和反序列化(含加密解密等)
前言 在项目中,我们经常用到各种配置文件,比如xml文件.binary文件等等,这里主要根据实践经验介绍下xml文件的序列化和反序列化(毕竟最常用). 实践背景:我要做一个用户管理功能,用户账号信息存 ...
- springmvc中model可以封装的数据类型
查看源码可以知道,model中可以存放的数据类型 Model addAttribute(String var1, @Nullable Object var2); Model addAttribute( ...
- 运行pip报错:Fatal error in launcher: Unable to create process using '"'
参考: https://blog.csdn.net/cjeric/article/details/73518782
- 记一次ntp反射放大ddos攻击
2018/3/26 ,共计310G左右的DDoS攻击 临时解决办法:将web服务转移到同生产一个内网段的备份服务器a上,a提供web端口80,数据库通过内网连接还是沿用生产数据库. 后续解决办法:通过 ...
- 莫烦scikit-learn学习自修第三天【通用训练模型】
1. 代码实战 #!/usr/bin/env python #!_*_ coding:UTF-8 _*_ import numpy as np from sklearn import datasets ...
- Python包的相对导入时出现问题解决
资料参考: https://www.cnblogs.com/ArsenalfanInECNU/p/5346751.html 在python导入包,如下: from .units import * 经常 ...
- Spring Boot 构建电商基础秒杀项目 (三) 通用的返回对象 & 异常处理
SpringBoot构建电商基础秒杀项目 学习笔记 定义通用的返回对象 public class CommonReturnType { // success, fail private String ...
- codeforces347B
Fixed Points CodeForces - 347B A permutation of length n is an integer sequence such that each integ ...
- JarvisOJ Basic Base64?
GUYDIMZVGQ2DMN3CGRQTONJXGM3TINLGG42DGMZXGM3TINLGGY4DGNBXGYZTGNLGGY3DGNBWMU3WI=== 题目非常具有迷惑性,我一开始以为就是一 ...
- 第五十五天 css基础入门
一.引入css的三种方式 1.行间式 <div style="width: 100px; height: 100px; background-color: red">& ...