数据加密
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加密失败错误。 如果客户端收到这个错误,客户端返回初始化过程。
可以在每个系统中定义加密密钥的大小。 您应该使用足够大的密钥来保证安全性。
可供参考
- 公开密钥加密标准(PKCS) #1: RSA加密规范2.1版
http://www.ietf.org/rfc/rfc3447.txt - IETF RFC 3602, AES-CBC密码算法及其与IPsec的结合
http://www.ietf.org/rfc/rfc3602.txt