RSA非对称加密、验签
模拟场景
- A与B对接
- A司拥有一对RSA密钥 APublicKey、APrivateKey
- B司拥有一对RSA密钥 BPublicKey、BPrivateKey
- 数据有三大模块
- 透明参数
- 业务参数(需要加密处理)
- 签名
- A 与 B互相知晓对方的公钥
- 密钥对通过OpenSSL生成
数字签名与验证签名的重要性
我们的数据传输是基于HTTP协议的,A与B在通信的过程中,可能遭遇数据劫持,C在截取到A发给B的数据之后,如果修改部分数据,再次发给B就造成了灾难。所以我们需要一个条件来确定过数据是最原始的数据。这就是签名存在的目的。
广义上的签名是对数据做一个摘要,可以通过数据得到签名,但是不能通过签名逆向得到数据。
A与B数据通信加密解密逻辑
假设A向B发送数据:
透明参数是不包含业务参数的参数字段,例如时间戳,字符集等要素。我们不需要对其进行加密处理。
业务参数:A使用B的公钥(BPublicKey)进行加密,那么只有拥有B公司私钥的才能解密出其中的数据(也就是B公司自己)
具体的代码实现(golang):
|
|
在完成参数之后需要对业务数据进行签名,A使用自己的私钥(APrivateKey),那么所有拥有A公钥的公司就能知道数据是否是完整的、未被篡改的,具体的代码实现(golang):
随后我们把角色从A转换到B
在签名确认之前用B自己的私钥(BPrivateKey)解密参数代码实现:
之后我们需要验证签名,来确保数据是未被篡改过的,使用A的公钥(APublicKey)代码实现:
还有一点就是我们需要把解密后的数据通过BASE64再次加密在传输,一是为了加密强度,而是为了保证加密解密的安全性。