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

签名认证的原理java

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

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

代码实现: 分布式

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

2服务端参数签名校验网站

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

代码实现 加密

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

3.服务端响应数字签名生成架构设计

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

代码实现 cdn

服务端将须要响应的内容做为待摘要串,使用MD5算法进行摘要,而后使用服务端的私钥对摘要串进行加密,而且对加密的密文进行十六进制编码。

  1. 客户端响应签名校验

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

代码实现

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

总结

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

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

相关文章
相关标签/搜索