消息加密和解密
ZOLOZ 网关协议能够实现消息加密,保证数据在消息传输过程中不被篡改。若商户发送了加密请求,ZOLOZ 服务会返回加密响应;但是,若商户发送了未加密请求,ZOLOZ 服务就会返回未加密响应。
由于ZOLOZ 服务处理的数据可能包含敏感信息,为增强消息传输安全性,ZOLOZ 服务会对响应消息进行加密。敏感信息包括所有敏感的个人身份信息,例如姓名、身份证号码、生日、地址、人脸等。
消息加密
加密流程
下图展示了从商户角度如何进行请求消息加密,以及从 ZOLOZ 服务角度如何进行响应消息加密。
图 1. 消息加密活动图
消息加密步骤
1. 获取公钥
- 对于请求消息,商户账户创建时, ZOLOZ 系统会生成一个 RSA 2048 密钥对。生成的密钥对对于每个商户都是唯一的,并且包含一个公钥。商户需提前获取公钥。
- 对于响应消息,商户端必须生成一个 RSA 2048 密钥对。生成的密钥对包含一个公钥。必须在 ZOLOZ 系统中完成公钥注册后才能发送任何请求。 ZOLOZ 服务可使用已注册的公钥进行后续的响应消息加密。
2. 准备待加密内容
待加密内容是业务请求或业务响应相关的明文消息,格式通常是 JSON 字符串。
3. 生成 AES 对称密钥
AES 对称密钥是随机生成的一个 128 位数据 。
4. 加密内容
内容加密公式:
ENCYRPTED_CONTENT_STRING=base64urlsafe_encode(aes_encrypt($CONTENT_TO_BE_ENCRYPTED, $AES_KEY))
内容加密方法:
aes_encrypt
:使用 AES 算法加密消息的方法。有关更多信息,请参见 aes_encrypt。base64urlsafe_encode
:用于编码加密数据。有关更多信息,请参见 base64urlsafe_encode。
输入参数:
CONTENT_TO_BE_ENCRYPTED
:步骤 2 准备待加密内容 准备的内容字符串。AES_KEY
:步骤 3 生成 AES 对称密钥 生成的 AES 对称密钥。
输出参数:
ENCRYPTED_CONTENT_STRING
:加密内容字符串。
5. 加密 AES 密钥
AES 密钥加密公式:
ENCYRPTED_AES_KEY=base64urlsafe_encode(rsa_encrypt($AES_KEY, $PUBLIC_KEY))
AES 密钥加密方法:
rsa_encrypt
:用于加密 AES 密钥。有关更多信息,请参见 rsa_encrypt。base64urlsafe_encode
:用于编码加密数据。有关更多信息,请参见 base64urlsafe_encode。
输入参数:
AES_KEY
:步骤 3 生成 AES 对称密钥 生成的 AES 对称密钥。PUBLIC_KEY
:步骤 1 获取公钥 获取的公钥。
输出参数:
ENCYRPTED_AES_KEY
:加密 AES 密钥字符串。
6. 配置 header 和 body
- 配置
Encrypt
header.。
在HTTP header Encrypt
字段中指定加密 AES 密钥,格式如下:
Encrypt: algorithm=RSA_AES, symmetricKey=<ENCYRPTED_AES_KEY>
- 配置
Content-Type
header。
内容格式设置为 text/plain:
content-type: text/plain
- 配置 HTTP body。
加密内容字符串 (步骤 4 加密内容 获取的 ENCYRPTED_CONTENT_STRING
)设置为 HTTP body。
消息解密
解密流程
下图展示了从 ZOLOZ 服务角度如何进行请求消息解密,以及从商户角度如何进行响应消息解密。
图 2. 消息解密活动图
消息解密步骤
1. 获取私钥
- 对于请求消息,商户创建账号时, ZOLOZ 系统会生成一个 RSA 2048 密钥对。生成的密钥对对于每个商户都是唯一的,并且包含一个私钥。ZOLOZ 服务可使用该私钥解密包含在加密请求中的对称密钥。
- 对于响应消息,商户端必须生成一个 RSA 2048 密钥对。生成的密钥对包含一个私钥。商户可使用该私钥解密包含在加密响应中的对称密钥。
2. 获取待解密内容
待解密的内容为整个已加密的 HTTP body。
3. 提取加密 AES 对称密钥
提取包含在 HTTP request header 或者 HTTP response header Encrypt
字段中的加密 AES 对称密钥。
Encrypt: algorithm=RSA_AES, symmetricKey=<AES_KEY_TO_BE_EXTRACTED>
4. 解密 AES 密钥
AES 密钥解密公式:
AES_KEY=rsa_decrypt(base64urlsafe_decode($ENCRYPTED_AES_KEY), $PRIVATE_KEY)
AES 密钥解密方法:
base64urlsafe_decode
:用于解码加密数据。有关更多信息,请参见 base64urlsafe_decode。rsa_decrypt
:用于解密密文。有关更多信息,请参见 rsa_decrypt。
输入参数:
ENCRYPTED_AES_KEY
:步骤 3 提取加密 AES 对称密钥 提取的加密 AES 密钥。PRIVATE_KEY
:步骤 1 获取私钥 获取的私钥。
输出参数:
AES_KEY
: 加密消息内容时随机生成的初始 AES 密钥。
5. 解密内容
内容解密公式:
PLAIN_CONTENT_STRING=utf8_encode(aes_decrypt(base64urlsafe_decode($Content_To_Be_Decrypted, $AES_KEY))
内容解密方法:
base64urlsafe_decode
:用于解码加密数据。有关更多信息,请参见 base64urlsafe_decode。aes_decrypt
:用于解密密文。有关更多信息,请参见 aes_decrypt。utf8_encode
:用于将二进制数据编码为 UTF-8 文本字符串。有关更多信息,请参见 utf8_encode。
输入参数:
输出参数:
PLAIN_CONTENT_STRING
: 待使用的明文内容字符串,格式通常是 JSON 字符串。