网络环境,http/https 数据传输,有时候我们需要特别保证数据传输的安全性和私密性,为了防止数据被串改和窃取,比较常见的做法,是采用https,按照ssl 协议进行加密传输,当然也有客户端对请求的数据进行签名,服务端对接收的数据进行验签,来达到保证数传输的准确性,除此之外,还有没有其他的方案呢?
这就需要我们了解 非对称加密的思想了 非对称加密算法
基于非对称加密的公私钥, 客户端可以用私钥对传输的数据进行加密,服务端可以用私钥对应的公钥,进行解密,从而能达到要求。 JAVA实现RSA生成公私钥/加解密/签名验签
当然在公私钥加解密的过程中,也可以附加 签名和验签,来进一步保证的传输数据的私密性、安全性和正确性,具体思路如下:
思路方案一:
/** 私钥加密-签名 ——> 验签-公钥解密
* 客户端操作:
*
* 原串:{"aa":1}
*
* 私钥加密 {"context":"aaaxxx"} aaaxxx为 {"aa":1} 的密文
*
* 签名并拼装请求数据 {"context":"aaaxxx","signData":"xxyy"} xxyy为 对 {"context":"aaaxxx"} 的签名
*
* 服务端操作:
*
* 接收参数数据:{"context":"aaaxxx","signData":"xxyy"}
*
* 验签 true
*
* 公钥解密 aaaxxx ——> {"aa":1}
*
* 执行业务
*
*/
思路方案二:
/** 签名-私钥加密 ——> 公钥解密-验签
*
* 客户端:
*
* 原串:{"aa":1}
*
* 签名 {"aa":1,"signData":"xxyy"}
*
* 私钥加密 aaaxxx
*
*
*
* 服务端:
*
* 接收的密文: aaaxxx
*
* 公钥解密 : {"aa":1,"signData":"xxyy"}
*
* 验签 true
*
* 执行业务
*/
方案一和方案二只是加解密和签名的顺序不一样,功效上差别不大,相较于方案二,方案一额外增加了非业务字段key:contex,不算太可取,个人更倾向于方案二。