前端实现数据传输的加解密的方法

0 阅读6分钟

背景与目标

如果做过政企银行类项目的都知道,这类项目的特点就是对于数据安全及其重视,所以为了防止爬虫、防请求篡改,本方案结合HTTPS原理和微信支付加解密设计,对称加密、非对称加密、签名等技术,为API接口提供加解密设计和落地。

方案设计

  • 对称加密:采用相同的密钥进行加密和解密。具有加密速度快、计算量小的特点,但密钥的安全传输是问题。在本方案中,对称加密主要用于数据的实际加密传输。
  • 非对称加密:使用一对密钥(公钥和私钥)进行加密和解密。公钥用于加密数据,私钥用于解密数据。非对称加密可以确保密钥的安全川书,但加密速度较慢,不适合长文本加密。在本方案中,非对称加密主要用于对称密钥的加密。
  • 哈希算法:无论用户输入什么长度的原始数据,经过计算后输出的密文都是固定长度的,只要原数据稍有改变,输出的“摘要”便完全不同。
  • 签名算法:一般指的是,通过私钥对数据进行签名,然后通过公钥对数据进行验签。

为了更好地理解该加解密流程,先来了解一下HTTPS原理。 HTTPS(Hypertext Transfer Protocol Secure)是一种通过计算机网络进行安全通信的传输协议。它利用SSL/TLS协议在HTTP应用层进行通信加密,通过证书进行身份验证,从而确保数据传输的安全性和完整性。

image.png 同时,为了加深对于加解密的影响,我们再来了解一下微信支付加解密的原理

  • 请求签名:通过商户API证书私钥,对每一次请求进行RSA签名,微信支付进行验签。
  • 回调验签:微信支付通过平台证书进行验签,对每一次回调进行RSA签名,商户收到请求后,通过平台正式公钥进行验签。
  • 回调解密:商户根据配置的API密钥,对加密数据进行AE
  • S解密。

image.png

所以我们接口加解密的设计思路主要分为以下几个步骤

  • 密钥交换:客户端使用服务端的公钥对对称加密的密钥进行加密,然后将密文密钥发送给服务端。服务端使用自己的私钥解密得到对称加密的明文密钥。
  • 数据加密:客户端使用对称加密的明文密钥对接口数据进行加密,然后发送给服务端,服务端使用相同的对称加密密钥对数据进行解密。
  • 数据哈希(签名):在数据发送前,客户端计算数据的哈希值,并将哈希值作为数据的一部分发送给服务端,服务端接受到数据后,使用相同的算法计算哈希值,并将客户端发送的哈希值进行比较以验证数据的完整性。
  • 数据有效性校验:在数据发送前,客户端将当前时间作为数据的一部分发送给服务端。服务端收到数据后,解密得到参数中的时间,并与服务端当前时间进行比较,以验证请求是否过期,防止请求重放。

技术实现

  1. 密钥生成与管理:通过工具生成非对称密钥对,服务端负责保存私钥(客户端也可以定期从服务端获取公钥(传输过程中有泄漏的风险),并保存到LocalStrage)
  2. 加密算法选择:对称加密算法可选用常用的AES,非对称加密可以选用常用的RSA。哈希算法可选用SHA、MD5。
  3. 签名规则:等queryString和body参数加密后,将queryString、时间戳、明文对称密钥、body参数按顺序进行拼接,然后通过SHA256算法进行哈希得到签名sign,然后将sign放在header中进行传递。
  4. 参数传递:key:非对称加密后的对称密钥,iv:初始化向量;request:请求参数。
  5. 后端处理:首先进行有效检验,再通过私钥解密key,得到明文的对称密钥key,然后验签,通过明文对称密钥解密参数,然后将响应结果通过对称加密返回给客户端。

具体实现流程

  1. 加密流程

第一步:客户端使用crpto插件生成AES密钥和IV(生成AES密钥和16字节的随机IV) 第二步:在请求的headers中增加一个RequestID,用于标识请求,方便后续的解密过程找到对应的密钥和IV。 第三步:RSA加密,将AES密钥和IV转换为base64格式已便在HTTP请求中传输;使用预定义的RSA公钥加密AES密钥。 第四步:数据加密:将参数转换为JSON字符串后使用AES加密数据并将加密后的数据转换为base64,构建请求体:k:加密后的AES密钥,v:iv;request:加密后的数据。

  1. 解密流程

第一步:查找对应密钥,根据响应头中的RequestID,在缓存数据中找到对应的AES密钥和IV。 第二步:数据解密:将响应数据使用AES密钥和IV进行解密。 第三步:清理缓存,解密完成后,从缓存中移除对应的条目。

  1. 安全特性
  • 密钥管理:每个请求使用唯一的AES密钥和IV;AES密钥通过RSA加密保护;使用请求ID追踪密钥生命周期。
  • 加密算法:AES用于数据加密;RSA用于密钥加密;Base64用于二进制数据编码。
  • 加解密方法:该加解密方法结合了对称加密与非对称加密的混合加密方案。

非对称加密:非对称加密使用一对密钥,即公钥和私钥。在这个代码中,使用RSA算法进行非对称加密,具体来说,AES密钥(对称加密使用的密钥)被RSA公钥加密后传输给服务器,这样,只有持有对应的私钥的服务器才能解密出AES密钥。 对称加密:对称加密使用相同的密钥进行数据的加解密,这个方法中,AES算法被用作对称加密,用于加密实际的数据。AES密钥和IV是对称加密过程中使用的密钥和参数,它们在加密数据前被生成,并与加密数据一起传输给服务器,以便服务器可以解密数据。

总的来说,这个流程中,非对称加密(RSA)用于加密对称密钥(AES密钥),用于确保密钥的安全传输;对称加密(AES)用于加密实际的数据,因为对称加密在处理大量数据时比非对称加密更高效。