问题引入:
客户端生成签名的时候,根据appid、时间戳、随机字符串、prepay_id四个参数来生成?疑问来了?微信支付并不知道我的随机字符串,那么它如何生成一样的签名呢?
答:随机字符串并不参与解密。随机字符串的两个作用如下:
1、确保每次请求的签名是唯一的,从而防止重放攻击。
2、增加签名的一致性,使得攻击者很难猜测或者伪造一个有效的签名。
微信支付服务验证签名有效性的流程:
微信支付服务验证签名有效性的流程:
1、客户端生成签名
- 客户端按照约定的规则构造签名串,包括
appid
、时间戳
、随机字符串
、prepay_id
等参数。 - 将这些参数按字典序排序,并拼接成字符串。
- 在拼接后的字符串末尾加上一个密钥(secret key)。
- 使用HMAC-SHA256算法对字符串进行加密,生成签名。
2、发送请求
- 客户端将生成的签名与请求参数一起发送给微信支付服务器。
3、微信支付服务器验证签名
- 微信支付服务器接收到请求后,按照相同的规则重新构造签名串(简单说就是把
appid
、时间戳
、随机字符串
、prepay_id
拼接成字符串)。 - 微信支付服务器使用相同的密钥和HMAC-SHA256算法,对重新构造的签名串进行加密,生成一个新的签名。
- 微信支付服务器将新生成的签名与请求中的签名进行比对,如果一致,则验证通过。
关键点
- 密钥(secret key):
- 密钥是客户端和服务器之间共享的,只有双方知道。
- 微信支付服务器使用相同的密钥来重新生成签名,因此不需要知道具体的随机字符串内容。
- 签名验证的原理:
- 签名验证的原理是基于密钥的对称加密算法(如HMAC-SHA256)。
- 只要密钥和算法一致,生成的签名就会一致,从而验证请求的完整性和真实性。
- 签名和签名方式
- 签名可以简单理解成加密。签名方式可以简单理解成加密方式。