数据加密

Estimated reading time: 1 minute

模块概述

本节概述使用REST API加密模块的加密系统。要实现加密API,请根据以下规范使用该模块。

加密模块为安全通信提供加密/解密功能。

*该系统对需要与标准2048/1024位RSA秘密通信的字符串格式参数进行加密和解密 RFC 3447 external link 128位AES-CBC算法 RFC 3602 external link.

  • 该系统不加密整个通信,只加密特定的参数。这意味着通信的方式与任何关于JSON协议的正常通信相同。
  • 这个系统的存在是为了防止通信被拦截。它不是针对非法访问或假冒的对策。

加密流

加密流如下图所示。

这个加密系统是混合的,有一个公钥和一个公钥。 机密数据由AES公钥加密,RSA公钥用于在客户机和服务器之间安全地共享公钥。 在初始化期间,服务器生成RSA公共/私有密钥。 客户端接收RSA公钥,生成AES公钥并使用RSA公钥对其进行加密。 初始化后,客户端可以使用这两个密钥发送和接收加密的数据。

客户端应为每个消息生成一个不同的初始化向量 (IV)。

使用加密的api具有加密数据和加密密钥的参数。 当客户端调用加密API时,服务器使用服务器生成的RSA私钥解密公共密钥,并使用公共密钥解密数据。

从服务器接收机密数据的过程如下图所示。

初始化过程是相同的。 在这两种情况下,即使使用公钥,加密的数据和加密的密钥也会进行通信。 即使被截获,第三方也无法获得原始数据。

API定义

getPubicKey 加密服务中的API是该加密系统的常用API。 其他发送或获取加密参数的api有一个“encKey”元素和至少一个加密数据元素。 即使API有多个加密元素,“encKey”也是通用的,必须包含在params中。

JSON Example: send

{
    "method":"sendSecretData",
    "params":[
        {
            "secretData1":"G9KgQDustrxplKFcy9fnVQ==",
            "secretData2":"At2gQDgst6xplKFcy9fnVQ==",
            "encKey":"hCkxUu4WydqDwrlq+PsSSxBaIVbPFNeCU7XYgBC9bVmXvcTORXMdY5FeSr3LYu9WywFbh1WwTBW/S+xTPHZQXhQMUsWEFQwUSldm5xK8vhOcdzGe8kdrixAL6zL9qx6rioR95gF50FO1RRVS7jdsabPvHK5gXZHM9B2h24QKON1FeTkYVGKcf8J3JJp9gEWeNYG2bfMSvnS9qrn2bLXgAX71vwEz7Btm/+qmX7/nsrL5QGBdbgxUlK7q5JzZxOdDuh592lfdEoMIgFR144XAnhfqyCcuZLJ/60VjOpREQ17vTj6+NNVrSOIq4eHnBlB7SfFWM/CBa+rCFmYAzmm3VQ=="
        }
    ],
    "id":1,
    "version":"1.0"
}
{
    "result":[],
    "id":1
}

JSON Example: get

{
    "method":"getSecretData",
    "params":[
        {
            "encKey":"hCkxUu4WydqDwrlq+PsSSxBaIVbPFNeCU7XYgBC9bVmXvcTORXMdY5FeSr3LYu9WywFbh1WwTBW/S+xTPHZQXhQMUsWEFQwUSldm5xK8vhOcdzGe8kdrixAL6zL9qx6rioR95gF50FO1RRVS7jdsabPvHK5gXZHM9B2h24QKON1FeTkYVGKcf8J3JJp9gEWeNYG2bfMSvnS9qrn2bLXgAX71vwEz7Btm/+qmX7/nsrL5QGBdbgxUlK7q5JzZxOdDuh592lfdEoMIgFR144XAnhfqyCcuZLJ/60VjOpREQ17vTj6+NNVrSOIq4eHnBlB7SfFWM/CBa+rCFmYAzmm3VQ=="
        }
    ],
    "id":1,
    "version":"1.0"
}
{
    "result":[
        {
           "secretData":"G9KgQDustrxplKFcy9fnVQ=="
        }
    ],
    "id":1
}

实施指南

有关加密模块的使用情况,请参阅每个平台模块中的自述。

在初始化期间,服务器生成RSA公共/私有密钥对。 由于生成一个大密钥需要很长时间,所以要根据每个系统的策略来定义RSA密钥的位大小和管理方式。 在初始化过程中,客户端通过调用getPublicKey获取服务器公钥,并创建一个公共密钥,将其加密为“encKey”。 之后,客户端使用这些密钥调用加密api。

为了保持服务器的私钥和客户端的公钥之间的一致性,服务器在初始化后不应更改密钥。 客户端可以在不同的API调用上使用相同的公共密钥。 此外,如果需要,客户端还可以重新创建公共密钥和“encKey”,以提高安全性。

当加密模块由于密钥不一致等非法状态而无法加密或解密时,服务器将返回40002加密失败错误。 如果客户端收到这个错误,客户端返回初始化过程。

可以在每个系统中定义加密密钥的大小。 您应该使用足够大的密钥来保证安全性。

可供参考

  1. 公开密钥加密标准(PKCS) #1: RSA加密规范2.1版
    http://www.ietf.org/rfc/rfc3447.txt
  2. IETF RFC 3602, AES-CBC密码算法及其与IPsec的结合
    http://www.ietf.org/rfc/rfc3602.txt
Last modified: 26 Dec 2019