API签名认证是一种用于验证API请求合法性的安全机制,它确保只有经过授权的用户或应用程序能够访问API,并防止未经授权的访问和数据篡改。以下是关于API签名认证的详细解释:
定义与作用
- 定义:API签名认证是一种安全机制,通过为每个请求生成一个唯一的签名值来验证其合法性。
- 作用:
- 身份验证:验证请求发送者的身份是否合法。
- 防止篡改:确保请求在传输过程中没有被篡改。
- 防止重放攻击:防止攻击者重复发送之前截获的合法请求。
实现思路
- 密钥分配:为每个客户端或用户分配一个独特的AppKey(也称为密钥),该密钥不直接参与数据传输,而是用于接口加密和身份验证。
- 签名生成:
- 将AppKey(或称为secretKey)与所有请求参数结合成一个源字符串。
- 使用特定的签名算法(如MD5、SHA-1等)对源字符串进行加密,生成签名值。
- 校验签名:
- 客户端在请求中包含生成的签名值。
- 服务端接收到请求后,使用相同的算法和密钥重新计算签名值。
- 如果服务端计算的签名值与客户端提供的签名值相同,则验证通过;否则,验证失败。
额外安全措施
- 随机数(nonce):为每个请求生成一个唯一的随机数,并包含在请求中。服务端保存已使用过的随机数,以防止重放攻击。
- 时间戳(timestamp):在请求中包含时间戳,服务端验证该时间戳是否在指定的时间范围内。这有助于防止使用旧的请求进行重放。
关键点归纳
- AppKey/secretKey:用于生成和验证签名的密钥。
- 签名算法:如MD5、SHA-1等,用于将请求参数和密钥转换为签名值。
- 请求参数:包括在签名生成过程中的所有请求参数。
- 随机数和时间戳:用于防止重放攻击和确保请求的新鲜性。
通过API签名认证,可以确保API请求的安全性和完整性,有效防止未经授权的访问和数据篡改。
为什么需要api签名认证?
1.保证安全性,不能随便一个人就调用
2.适用于无需保存登录态的场景,只认签名,不关注用户的登录态。
签名认证实现
通过http request header 头来传递参数。
参数1:accessKey:调用的标识userA,userB(复杂,无序,无规律)
参数2:secretKey:密钥(复杂无序无规律)该参数不能放在请求头中
参数3:用户请求参数
参数4:sign
加密方式:
对称加密,非对称加密,md5签名(单向加密)
用户参数 + 密钥=>签名生成算法(MD5)=>不可解密的值
abc+abcdefg =>sfsdafsadsfgsdy
怎么知道这个签名对不对?
服务端用一摸一样的参数和算法去生成签名,只有和用户传的一致,就表示一致。
怎么防重放?
参数5:加nonce随机数,只能用一次
服务端要保存用过的随机数
参数6:加timestamp时间戳,校验时间戳是否过期。