大家在开发过程中都接触过接口,或者开发接口或者调用接口,那么对于接口的安全性了解吗?知道怎么增强自己接口的安全性吗?
普通的开放API:
特点:人人都可以调用,没有权限控制(或者最多有个登录限制)
试想:银行、微信、支付宝转账接口是对外开放,假如我们常用的微信转账,微信服务器给我们提供了一个转账接口,我们怎么来使用这个接口,又存在哪些安全隐患?
开放API可能存在的问题:
1、人人都能来调用这个接口转账,需要登录—》需要有转账人身份验证机制
2、转账人的用户名和各种密码可能泄露—》需要保证用户名和密码安全传输 3、转出的金额10w-1w,
—》需要保证转出的金额不能修改,防止参数被篡改 4、转出的请求可能被人拦截后多次重发----》需要保证请求的唯一性,防止请求被重放 5、需要确认被请求的服务器是真是的而不是钓鱼网站—》需要确认服务器的真实性
总结起来,需要考虑接口安全机制的原因主要如下:
1)防止不被允许的第三方有意或无意调用 2)防止传输数据被篡改 3)防止重要数据信息泄露 4)防止第三方拦截请求并进行重放
5)防止被请求的网站被假冒
常见的接口安全制分类:
用户认证 参数签名 传输数据加密
下面来给大家讲解一下用户认证:
1)用户认证----用户认证 --》对用户访问资源的权限进行校验—》对用户身份的验证----》对用户名、密码的校验
HTTP Basic Auth(基本认证)
工作原理:依靠 http 协议的请求头Authorization和响应头WWW-Authenticate来完成认证过程
具体过程:浏览器发起请求的时候在请求头Authorization字段里面防止 ‘密文的用户名和密码信息’,服务器收到请求以后去检查请求头里面Authorization字段,取出里面的值看是否正确,如果正确就返回浏览器请求的信息,不正确就返回401
密文生成:base64(用户名:密码)-----》YWRtaW46YWRtaW4=
服务器验证:对接收到的密文进行base64解码 ----》用户名、密码
特点:base64 是一个公开的编码算法,业内人都知道------》防君子,不能防小人
HTTP Digest Auth(摘要认证)
工作原理:依靠 http 协议的请求头WWW-Authenticate和响应头WWW-Authenticate来完成认证过程
具体过程:浏览器发起请求的时候在请求头WWW-Authenticate字段里面放置用户名、带密码的密文字符串、其他参数,服务器收到请求以后去检查请求头里面WWW-Authenticate字段,取出里面的值来看是否正确,如果正确就返回浏览器请求的信息,不正确就返回401
密文生成:hash(密码+其他字段)—摘要
服务器验证:用户名—》去数据库查出对应的密码,使用hash(密码+其他字段)—》hash ,比较两个hash值,如果相等则认证成功,不相等则认证失败,返回401
特点:可以防止一定程度的重放攻击,密码用密文传输,比较安全
Token认证(令牌认证)
工作原理、过程:
1、 客户端请求第三方资源
2、 第三方向认证服务器请求授权
3、 认证服务器向用户请求授权
4、 用户同意授权后,认证服务器给第三方返回一个令牌—token
5、 第三方将这个令牌返回给用户,后续用户的所有请求都必须带上这个令牌
Token认证的代表,OAuth(开放授权认证)–允许用户让第三方应用访问在某一服务器上的私密资源(如照片、头像、身份信息等等),而无需将用户名和密码提供给第三方
JSON WEB TOKEN(JWT) Token 组成:头部、载荷、签名
头部:签名使用的算法
载荷:签发者、使用方域名、过期时间、用户角色、用户名、密码等等
签名:使用加密算法对头部和载荷加密的结果 -RSA(base64(头部).base64(载荷))
JWT Token 生成:
生成时机:用户第一次登录成功的时候生成,加密算法由服务器根据配置文件选定
令牌生成:token = base64(头部).base64(载荷). RSA(base64(头部).base64(载荷))
JWT Token传递:
url:http:www.xxl.com?token = base64(头部).base64(荷载).RSA(base64(头部).base64(荷载))
JWT Token验证:
头部: base64(头部).decode()–头部—》签名算法
载荷:base64(载荷).Decode()-载荷----》传送的信息(签发者、使用方域名、过期时间、用户角色、用户名、密码、秘钥)
签名:
1、认证服务器收到请求,查看请求里面是否有token参数或者请求头里面是否有token
2、取出token,使用.分割,得到头部、载荷、签名三部分
3、使用base64解码头部和载荷,拿到原始的头部(签名算法)和载荷(签名需要的数据)
4、取认证服务器上面读取配置文件,拿到签名算法对应的解密算法,使用解密算法对签名进行解密
5、比较解密后的签名里面的载荷里的值和收到载荷里面的值,如果相等,说明数据没有被修改,认证成功,返回用户需要的值
相信了解了上述内容以后,对于加强自己接口安全方面一定能给你提供新的思路.