API 接口安全整理

1. API 接口安全整理

1.1. HTTP 接口安全概述:

HTTP 接口是互联网各系统之间对接的重要方式之一, 使用 HTTP 接口, 开发和调用都很方便, 也是被大量采用的方式, 它可以让不同系统之间实现数据的交换和共享, 但由于 HTTP 接口开放在互联网上, 那么我们就需要有一定的安全措施来保证不能是随随便便就可以调用;

目前国内互联网公司主要采用两种做法实现接口的安全:

  • 一种是以支付宝等支付公司为代表的私钥公钥签名验证机制;
    -一种是大量互联网企业都常采用的参数签名验证机制;

1.2. HTTP 接口安全演进:

  1. 完全开放的接口(完全开放)
  2. 接口参数签名(基本安全)
  3. 接口参数签名 + 时效性验证(更加安全)
  4. 接口参数私钥签名公钥验签(固若金汤)
  5. 接口参数签名 + HTTPS(金钟罩)
  6. 口参数私钥签名公钥验签 + HTTPS(金钟罩)

总之: 安全是相对的, 只有相对的安全, 没有绝对的安全!

1.3. HTTP 接口安全设计及应用

1.3.1. 接口参数私钥签名公钥验签

先来看看私钥 + 公钥的安全模式, 这是一种更为安全的方式, 它通过私钥和公钥实现接口的安全, 目前互联网中主要是以支付宝

为代表的公司采用这种机制; (有很多开放平台也是采用这种机制) . 具体业务流所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZPbCqYLg-1670570282844)(HTTPS://hjs-1251193177.cos.ap-shanghai.myqcloud.com/web/api-sign1.png)]

该签名是通过 4 个秘钥来实现的, 分别是:

客户端应用私钥 , 客户端公钥 , 服务端应用私钥 , 服务端公钥.

私钥都是用来生成签名的, 公钥都是用来解密的, 客户端的公钥解密客户端的私钥生成的签名, 服务端的公钥解密服务端的私钥生

成的签名, 相信这样解释应该会比较好理解的.

好了, 下面就来看看是如何具体操作的, 我的具体操作步骤:

首先, 4 把密钥都是通过 OpenSSL 工具生成, 你需要先获得这个工具: 官方网站: HTTPS://www.openssl.org/

介绍一下这个工具吧, OpenSSL 是一个开源的安全套接字层密码库, 囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议, 并提供丰富的应用程序测试或其它目的使用; OpenSSL 整个软件包大概可以分成三个主要的功能部分: SSL 协议库、应用程序以及密码算法库;

  1. 确保 Linux 已经安装 openssl  :

使用命令检查 Linux 是否已经安装 openssl: yum list installed | grep openssl

如果没有安装, 则执行命令进行安装: yum install openssl openssl-devel -y

  1. 创建秘钥生成的目的地(文件夹):

我是在根目录中的 soft 文件夹下创建的

mkdir server , mkdir client 先创建这两个文件, 然后 Linux 会默认将生成的秘钥放入其中.

  1. 生成秘钥

进入 server 文件, 输入 openssl  进入 Openssl 命令行;

使用 openssl 生成私钥, 执行如下命令:

genrsa -out rsa_private_key.pem 2048

注意一点 Java 开发者需要将私钥转换成 PKCS8 格式, 其他语言不用这一步操作, 执行如下命令:

pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out rsa_private_key_pkcs8.pem

使用 openssl 生成公钥, 执行如下命令:

rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

退出 openssl 命令行: exit

经过以上步骤, 我们可以在当前目录中 (server) 看到三个文件:

rsa_private_key.pem(RSA 私钥)
rsa_private_key_pkcs8.pem(pkcs8 格式 RSA 私钥)(我们 java 要使用的私钥是这一个)
rsa_public_key.pem(对应 RSA 公钥)

client 端的秘钥与 server 端的秘钥生成一样, 这里就不叙述了, 想体验的朋友自己按照上一步操作再做一遍即可.
over, 以上就是使用私钥 + 公钥进行 HTTP 接口安全设计的简单上手示例.

个人觉得, 能把这个私钥公钥的搞明白了, 其他的几个接口安全设计也就不在话下了, 基本看一下流程图就能了然于心了. 这里就放出参数安全设计的流程图, 具体代码就不写了, 有兴趣的可以尝试着做一下.

为了方便练习的盆友快速理解, 那就顺带提几个需要注意的点吧.

在做:“接口参数签名 + 时效性验证(更加安全)” 时, 注意服务端返回的签名就不需要再传时间戳了, 理应是要传的, 但是一般很少有人这么做. 不过, 要不要这么做, 也得看公司的要求嘛.

在拼装秘钥的时候, 注意字符串首先得进行排序, 不管是升序还是降序, 亦或是其他的顺序(比如公司要求的顺序), 如果不先按照一个约定的顺序进行排序, 那么势必会造成客户端与服务端参数的字符串排列顺序不同, 致使无法验证成功. 这里就提供一个简便的排序工具, 并且使用 MD5 进行 16 进制加密

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4N5sHfTm-1670570282845)(HTTPS://hjs-1251193177.cos.ap-shanghai.myqcloud.com/web/api-sign1.png)]

2. 心脏出血漏洞(Heartbleed)

2.1. 检测是否存在 Heartbleed 漏洞

2.1.1. 通过命令行工具查看

通过 openssl version 命令查看 openssl 版本不一定可靠, 为啥? 因为有些组织自己就有 patch, 而没有用官方的 patch, 比方说 RedHat/CentOS, 自己单独提供 patch 的, 版本号可能是还是那个版本号, 可分支已经发生变化了, 但是 rpm 包专门提供了漏洞查询接口:

# rpm -q --changelog openssl | grep CVE-2014-0160
- fix CVE-2014-0160 - information disclosure in TLS heartbeat extension 

如何提示有上面的 fix CVE-2014-0160 说明是已经安装了补丁的, 如果没有该行提示说明没有打上安全补丁、存在漏洞风险。

# openssl version -a

2.1.2. 通过在线检测网站

  • https://sslanalyzer.comodoca.com/heartbleed.html
  • http://heartbleed-checker.online-domain-tools.com/

2.2. 修复 Heartbleed 漏洞

升级至 openssl 最新版即可, 用系统里面的软件包管理工具就成, 这个漏洞太有名、影响太大了, 所有系统企业都会对它进行升级的。

  • RedHat/CentOS: # yum update openssl(建议用官方的这个, 不要下载使用第三方的 rpm 包, 有风险!)
  • Debian/Ubuntu: # apt-get install openssl(会提示升级)

Critical: Restart Services or Reboot

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云满笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值