关于web安全开发之签名认证

签名认证的原理

1.客户端请求数宇签名生成

与摘要认证的方式类似,由于传递端和接收端都认为HTTP协议的请求参数是无序的,因此对于签名认证来说,客户端与服务端双方需要约定好参数的排序方式。请求的参数经过排序后,再将参数名称和值经过一 定的策略组织起来,这时不再是加上 secret, 而是直接通过约定的摘要算法来生成数字摘要,并且使用客户端私钥对数字摘要进行加密,将加密的密文传递给服务端。

代码实现:


Java的java.security.Signature对数字签名的支持也非常出色,通过getlnstance方法取得MDSwithRSA的实例,即通过MDS进行数字摘要,并且使用RSA算法进行非对称加密,使用客户端私钥对signature进行初始化,update方法传入待摘要串,通过sign方法即可以取得对应内容的数字签名。

2服务端参数签名校验

在服务端接收到客户端传递的参数后,服务端会采用与客户端相同的策略对参数进行排序,并使用相同的摘要方式生成摘要串,然后服务端使用客户端的公钥将接收到的密文进行解密,得到客户端生成的摘要串,将服务端生成的摘要串与客户端生成摘要串进行比较。这样便可以得知,参数是否由客户端生成,并且参数的内容是否被篡改。


代码实现



使用Signature同样可以对数字签名进行校验,通过MD5withRSA获取Signature的实例,然后使用客户端公钥对signature进行初始化,将待摘要字符串传入update方法,然后使用verify方法便可以对数字签名进行校验。

3.服务端响应数字签名生成

同样的,服务端返回的响应,也需要采用约定好的摘要算法生成相应的摘要,并且使用服务端的私钥进行加密,然后将生成的密文作为响应的一 部分,返回给客户端,以便验证服务端的身份及返回数据的合法性。


代码实现


服务端将需要响应的内容作为待摘要串,使用MD5算法进行摘要,然后使用服务端的私钥对摘要串进行加密,并且对加密的密文进行十六进制编码。
  1. 客户端响应签名校验

当客户端接收到服务端的响应后,采用与服务端相同的摘要算法进行摘要,生成摘要串,然后使用服务端的公钥解密接收到的签名密文,得到服务端生成的摘要串,此时与客户端生成的摘要串进行比较,便可得知响应是否由服务端发出,以及响应的内容是否被篡改。

代码实现


客户端接收到服务端响应responseContent后,通过MD5算法生成摘要,然后使用服务端的公钥,对桵收到的数字签名进行解密,将解密得到的摘要串与通过MD5生成的摘要串进行对比,便可得知响应是否由服务端发送,以及响应的内容是否被篡改。

总结

签名认证能很好地解决客户端与服务端身份校验问题,以及通信内容防篡改问题。但HTTP协议使用的是明文传输,对于任何中途拦截客户端与服务端通信的第三方来说,通信传输的内容是可见的。通过对通信的拦截,能够监听和还原客户端与服务端的通信内容。对于这种情况,数字签名的方式便无能为力了。

摘自:
《大型分布式网站架构设计与实践》 阅读笔记

你可能感兴趣的:(关于web安全开发之签名认证)