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