libook
2022-07-26 12:46:03 +08:00
识别请求发起方的身份。比如我是一个攻击者,因为这个域的 CA 公钥是公开的,那么我完全可以发起一个跟合法用户一样加密的 HTTPS 请求。如果加上签名了,相当于服务器会对客户端的合法性进行验证,也就是说攻击者只要没法造出合法的签名,服务器就可以认定为非法请求。
你给出的 API 文档里说,你要在 map 序列化后拼接分配给你的 SK ,这个 SK 只有你和服务器知道,别人不知道,那么服务器就可以拿分配给你的 SK 做和你一样的操作就能得出相同的 MD5 ,就能证明请求是你发的,而不是其他人发的。
对于 HTTPS 来说,header 也是会被加密传输的,所以其实不是特别有必要将你的参数序列化一起签名。假设你签名不需要带着参数,一旦某一次的签名泄漏了,攻击者就可以拿着这个签名带着任何他想要的参数去发请求,服务器会误认为是你发的,所以带着参数一起签名可以在你签名泄漏过一次的时候,至少不会被别人伪造不同参数的请求。
签名的时候拼了时间戳,可以确保当签名泄漏一次后,在一定时间之外,攻击者无法使用相同参数来发起攻击。