签名认证的原理
1.客户端请求数宇签名生成
与摘要认证的方式类似,由于传递端和接收端都认为HTTP协议的请求参数是无序的,因此对于签名认证来说,客户端与服务端双方需要约定好参数的排序方式。请求的参数经过排序后,再将参数名称和值经过一定的策略组织起来,这时不再是加上 secret, 而是直接通过约定的摘要算法来生成数字摘要,并且使用客户端私钥对数字摘要进行加密,将加密的密文传递给服务端。
代码实现:
2服务端参数签名校验
在服务端接收到客户端传递的参数后,服务端会采用与客户端相同的策略对参数进行排序,并使用相同的摘要方式生成摘要串,然后服务端使用客户端的公钥将接收到的密文进行解密,得到客户端生成的摘要串,将服务端生成的摘要串与客户端生成摘要串进行比较。这样便可以得知,参数是否由客户端生成,并且参数的内容是否被篡改。
代码实现
3.服务端响应数字签名生成
同样的,服务端返回的响应,也需要采用约定好的摘要算法生成相应的摘要,并且使用服务端的私钥进行加密,然后将生成的密文作为响应的一 部分,返回给客户端,以便验证服务端的身份及返回数据的合法性。
代码实现
- 客户端响应签名校验
当客户端接收到服务端的响应后,采用与服务端相同的摘要算法进行摘要,生成摘要串,然后使用服务端的公钥解密接收到的签名密文,得到服务端生成的摘要串,此时与客户端生成的摘要串进行比较,便可得知响应是否由服务端发出,以及响应的内容是否被篡改。
代码实现
总结
签名认证能很好地解决客户端与服务端身份校验问题,以及通信内容防篡改问题。但HTTP协议使用的是明文传输,对于任何中途拦截客户端与服务端通信的第三方来说,通信传输的内容是可见的。通过对通信的拦截,能够监听和还原客户端与服务端的通信内容。对于这种情况,数字签名的方式便无能为力了。
摘自: 《大型分布式网站架构设计与实践》 阅读笔记