欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

AK/SK HMAC 认证方法详解

最编程 2024-07-27 16:06:02
...

概要介绍

AK/SK 认证通常用于调用 Open API【云服务 API】的服务端认证.
在对接 PASS 平台和支付平台的时候,都会要求我们预先生成一个 access key【AK】 和 secure key【SK】【私钥】,然后通过签名的方式完成认证请求;这样可以避免传输 SK,且大多数情况下签名只允许使用一次,避免重放攻击.
这种基于 AK/SK 认证的方式主要利用散列的消息认证码【Hash-based MessageAuthentication Code】来实现,因此很多地方又叫 HMAC 认证.

应用方式

我们可以把 HMAC 作为网络通信认证设计中的凭证生成算法,避免 SK 直接在网络上传输.

1. 客户端需要在认证服务器中预先申请 AK 和 SK
2. 在调用 API 的时候,除传递请求必要的参数之外,还需要传输一个通过 HMAC 算法生成的一个签名串【签名串的生成方法后面讲】
3. 服务器通过预先留存的 AK 和 SK 进行同样的摘要算法计算,得到的结果与客户端传输的额外的参数进行比对,如果一致,则认为该请求是有效的;否则将拒绝处理这次请求,并返回 HTTP 403

签名串的其中一种生成方法

假设请求的 URL 格式为 https://baidu.com/gate/move/?c=2&b=1

  1. 我们可以截取 urlPath部分,得到的结果为 gate/move
  2. 截取参数,c=2&b=1,然后将参数的键值对拼接在一起得到 c2 和 b1,最后按照首字母排序并拼接为一个字符串为 c2b1.
    3.将 1 和 2 得到的两个字符串拼接在一起得到 r = gate/movec2b1
    4.将得到的字符串通过【HMAC_SHA1】算法对 AK 进行签名 p =【HMAC_SHA1(r,AS)】
    5.对结果转换为十六进制 q = HEX(p)

存在的缺陷

目前的实现方式无法抵御重放攻击;因此我们需要在签名时放入一下干扰信息
在业界标准中解决这个问题有两种典型的做法
1)质疑/应答算法【OCRA: OATH Challenge-Response Algorithm】
质疑/应答算法需要预先客户端先请求一次服务器,获得 HTTP 状态码为 401 未认证的返回,并得到一个随机字符串(nonce)。将 nonce 附加到按照上面说到的方法进行 HMAC_SHA1 签名,服务器使用预先分配的 nonce 同样进行签名校验,这个 nonce 在服务器只会被使用一次【当然你可以给这个nonce设置一个有效期,只要在有效期之内均可以使用】,因此可以提供唯一的摘要

2)timestamp+nonce方案
nonce 指唯一的随机字符串,用来标识每个被签名的请求,通常为每个请求提供一个唯一的标识符,服务器能够防止请求被多次使用【记录所有用过的 nonce 以阻止它们被二次使用】;但是对于服务器永久存储所有接收到的 nonce 的代价非常大,因此可以通过 timestamp 配合 nonce 进行优化
假设客户端和服务端最多能存在 1 分钟的时间差;服务端需要记录客户端所有的 nonce 请求集合,当有新的请求进来后,检测当前携带的 nonce 是否在集合中存在;
如果不存在,则记录该 nonce 的值,有效期为 1分钟;
如果存在,则说明客户端在一分钟内进行了重复的请求,则拒绝服务;