场景

现今越来越多公司提供了Sass平台服务,大部分也直接提供API。如快递鸟、微信Api、云服务。如何保证这些服务的安全性是一门重要的课题。如快递跟踪、机票查询等很便捷地影响着我们d的生活,对这些技术开发人员有更高的技术要求。不仅体现在并发量这些基础性问题,更多的是安全性。

例如在云时代,我们需要使用云服务,会提供相应服务的密钥AccessKeyId与AccessKeySecret。再如如果你经常与微信公众号打交道的话,公众号也会提供对应Appid与AppSecret。

所以服务安全性越来越重要,本文也针对如何设计服务API的安全性做一些详细的探讨与设计。

需求

现今我们对服务有此需求:公司/个人写了一个服务(支付服务、快递服务),需要把此服务面向公网,供所有人使用。使用我们的服务的厂商/个人,都需要注册我们的账号才能使用。

前提

本文的探讨服务有几个前提:1)你的服务需要部署在公网。2)有安全性要求。3)使用HTTPS,使用HTTP根本无安全性可言。

本文讨论的重要在于如何提供给第三方应用安全性地访问API,不在于用户。如果是用户可查看OAuth2.0、JWT、OIDC的相关流程。

打好基础

在安全性,肯定离不开加密算法,下面来为大家打好算法基础。

在理解这些服务API之前,先要了解相关加解密算法的分类与优缺点。加密算法分为可逆与不可逆。可逆是对明文进行加密后,可以反向解密得到明文。不可逆是只能加密得到密文,不能解密。

不可逆加密一般应用于数字签名验证、密码保护、文件完整性。可逆算法一般应用于TCP请求。

不可逆算法有:MD5、SHA、HMAC。

可逆算法:RSA、DSA、ECC等。

着重介绍不可逆算法

不可逆算法有如下特点:

1. 压缩性:任意长度的明文数据,单向加密后长度都是固定的。

2. 抗修改性:修改明文,大部分情况下得到的结果都不一致。

3. 性能快:对明文数据进行单向解密处理速度快。

4. 抗碰撞性:很难找到不同的明文数据得出的加密结果一致。

MD5

MD5是最常见的不可逆算法,也称单向算法。经常被用作密码保存、文件验证等。例如我们下载一个文件,一般都会验证MD5来保证文件完整性。

MD5加密无需輸入密钥,直接使用明文即可加密。MD5根据不同的算法可输出固定长度为16位或者32位长度的字符串。

SHA

SHA是安全散列算法,他包含五个算法:SHA-1、SHA-224、SHA-256、SHA-384、HA-512。这些算法根据安全性,越往后生成的hash长度越长。目前使用得最多得是SHA-1。

它与MD5一样,无需密钥,直接使用明文即可加密。SHA比MD5安全,但相对性能慢一些。

HMAC

HMAC是哈希消息认证码。

HMAC是从加盐而来,所以它有密钥。HMAC是通过明文数据与密钥加密,这点与MD5与SHA不同。它多了个密钥,此密钥可用加盐处理。

服务API方式

1.OAuth2.0

OAuth2.0是最常用的API服务访问方式。它有四种方式:授权码、隐藏式、密码式、凭证式。

如果过程中有需要第三方网页登陆授权的应用,可使用授权码、隐藏式。因为他们包含了回调url的参数验证。如果是第三方应用,则可用凭证式。对于现今的需求,可使用凭证式,但凭证式可不那么安全。

至于OAuth2.0的详细介绍,这里做详细说明,因为网上很多资料。此篇文章的重点不在此方式。

参考:http://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html

2. OpenID Connect

也称为OICD,它是在OAuth2上构建了一个身份层,是一个基于OAuth2协议的身份认证标准协议。他是基于用户的,本文不详细介绍。不适用当前的场景。

参考:https://www.cnblogs.com/linianhui/p/openid-connect-core.html

3. JWT

JWT有三部分组成,分别为Header、Payload、Signature。

Header头部包含了加密算法内容。Payload负载包含了传输过程中用到的数据,是用base64生成。最后一部分Signature是签名,可使用HS256、RS256生成,用来防止token payload被篡改。

在服务API中,目前流行JWT的方式。JWT已经固定了很多的token key,所以一般用于有web客户端的用户账密登陆过程。

4. API密钥

这种方式我们讨论的重点。阿里云等各大云服务一般使用这种方式进行服务提供。

先来看看阿里云的这种请求示例:

GET /?prefix=xz02tphky6fjfiuc&max-keys=1 HTTP/1.1

Date: Thu, 15 May 2014 11:18:32 GMT

Host: oss-cn-hangzhou.aliyuncs.com

Authorization: OSS nxj7dtwhcyl5hpvnhi:COS3OQkfQPnKmYZTEHYv2****

可以看到,在请求Header消息头带上日期、密钥验证。下一篇文章,我们模仿这种来实现。我们首先一步步来讲解这种模式。

可以关注本人的公众号,多年经验的原创文章共享给大家。

如何设计提高服务API的安全性(一)基础介绍的更多相关文章

  1. 如何设计提高服务API的安全性(二)API密钥方式详解

    在上文已经讲述了基础介绍,这篇文章详细讲解API密钥方式. 利用何种加密方式呢? 经过上面加密算法的理解,单向加密不仅性能高,而且有压缩性,即长度一致,有效减少网络传输过程中的字节大小.适合我们这种调 ...

  2. 如何构建和设计以确保 API 的安全性

    如何构建和设计以确保 API 的安全性 面对常见的OWASP十大威胁.未经授权的访问.拒绝服务攻击.以及窃取机密数据等类型的攻击,企业需要使用通用的安全框架,来保护其REST API,并保证良好的用户 ...

  3. 如何设计好的RESTful API之安全性

    保证RESTful API的安全性,主要包括三大方面: a) 对客户端做身份认证 b) 对敏感的数据做加密,并且防止篡改 c) 身份认证之后的授权 1.对客户端做身份认证,有几种常见的做法: 1)在请 ...

  4. 使用JWT设计SpringBoot项目api接口安全服务

    转载直: 使用JWT设计SpringBoot项目api接口安全服务

  5. 服务API版本控制设计与实践

    一.前言 笔者曾负责vivo应用商店服务器开发,有幸见证应用商店从百万日活到几千万日活的发展历程.应用商店客户端经历了大大小小上百个版本迭代后,服务端也在架构上完成了单体到服务集群.微服务升级. 下面 ...

  6. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【八】——Web Api的安全性

    系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 这一篇文章我们主要来探讨一下Web Api的安全性,到目前为止所有的请求都是走的Http协议 ...

  7. [转]使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【八】——Web Api的安全性

    本文转自:http://www.cnblogs.com/fzrain/p/3552423.html 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html ...

  8. [转]在 Azure 云服务上设计大规模服务的最佳实践

    本文转自:http://technet.microsoft.com/zh-cn/magazine/jj717232.aspx 英文版:http://msdn.microsoft.com/library ...

  9. 微服务中台落地 中台误区 当中台遇上DDD,我们该如何设计微服务

    小结: 1. 微服务中台不是 /1堆砌技术组件就是中台 /2拥有服务治理就是中台 /3增加部分业务功能就是中台 /4Cloud Native 就是中台 https://mp.weixin.qq.com ...

随机推荐

  1. 8-剑指offer: 替换空格

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 代码: c ...

  2. vue-cli 3 和 vue-cli 2的区别

    分享文章: 浅谈vue-cli 3 和 vue-cli 2的区别 https://blog.csdn.net/weixin_42080056/article/details/81631661 vue- ...

  3. c# 第七节 编程规范,vs中的各种设置

    本节内容: 1:编程规范 2:vs中的各种设置 3:一个解决方案多个项目的创建.使用 1:编程规范 需要规范的地方: 1: 2: 2:vs中的各种设置 实现: 3:一个解决方案多个项目的创建.使用

  4. Linux下的SVN服务器搭建(八)

    1. 通过yum命令安装svnserve yum -y install subversion #查看svn安装位置 rpm -ql subversion 2. 创建版本库目录(此仅为目录,为后面创建版 ...

  5. CSP2019题解

    CSP2019题解 格雷码 按照生成的规则模拟一下即可. 代码 括号树 看到括号匹配首先想到用栈,然后又在树上就可以想到可追溯化栈. 令\(a_i=1\)表示\(i\)号节点上的括号为(,否则为), ...

  6. 文件夹如何添加备注(保证可以WIN7 WIN10测试通过)

    网上很多方法都有人说试过了,不可以.其实不是不可以,他们都没有说完整 今天自己弄了下,弄出来了,废话不多说先上图 如果需要用备注排序,那么就需要把排序的选项加上备注的分类 1.获得desktop.in ...

  7. C# HTTP系列5 HttpWebResponse.StatusCode属性

    系列目录     [已更新最新开发文章,点击查看详细] HttpWebResponse.StatusCode 属性获取响应的状态.对应 HttpStatusCode 枚举值之一. HttpStatus ...

  8. Golang(八)go modules 学习

    0. 前言 最近加入鹅厂学习 k8s,组内使用 Go 1.11 以上的 go modules 管理依赖,因此整理了相关资料 本文严重参考原文:初窥Go module 1. 传统 Golang 包依赖管 ...

  9. linux 查看用户列表

    cat /etc/passwd|grep -v nologin|grep -v halt|grep -v shutdown|awk -F":" '{ print $1"| ...

  10. Mysql load data infile 命令导入含中文csv源数据文件 【错误代码 1300】

    [1]Load data infile 命令导入含中文csv源数据文件 报错:Invalid utf8 character string: '??֧' (1)问题现象 csv格式文件源数据: 导入SQ ...