消息加密和解密

ZOLOZ 网关协议能够实现消息加密,保证数据在消息传输过程中不被篡改。若商户发送了加密请求,ZOLOZ 服务会返回加密响应;但是,若商户发送了未加密请求,ZOLOZ 服务就会返回未加密响应。

由于ZOLOZ 服务处理的数据可能包含敏感信息,为增强消息传输安全性,ZOLOZ 服务会对响应消息进行加密。敏感信息包括所有敏感的个人身份信息,例如姓名、身份证号码、生日、地址、人脸等。

消息加密

加密流程

下图展示了从商户角度如何进行请求消息加密,以及从 ZOLOZ 服务角度如何进行响应消息加密。

消息加密活动图.png

图 1. 消息加密活动图

消息加密步骤

1. 获取公钥

  • 对于请求消息,商户账户创建时, ZOLOZ 系统会生成一个 RSA 2048 密钥对。生成的密钥对对于每个商户都是唯一的,并且包含一个公钥。商户需提前获取公钥。
  • 对于响应消息,商户端必须生成一个 RSA 2048 密钥对。生成的密钥对包含一个公钥。必须在 ZOLOZ 系统中完成公钥注册后才能发送任何请求。 ZOLOZ 服务可使用已注册的公钥进行后续的响应消息加密。

2. 准备待加密内容

待加密内容是业务请求或业务响应相关的明文消息,格式通常是 JSON 字符串。

3. 生成 AES 对称密钥

AES 对称密钥是随机生成的一个 128 位数据 。

4. 加密内容

内容加密公式:

copy
ENCYRPTED_CONTENT_STRING=base64urlsafe_encode(aes_encrypt($CONTENT_TO_BE_ENCRYPTED, $AES_KEY))

内容加密方法:

  • aes_encrypt:使用 AES 算法加密消息的方法。有关更多信息,请参见 aes_encrypt
  • base64urlsafe_encode:用于编码加密数据。有关更多信息,请参见 base64urlsafe_encode

输入参数:

输出参数:

  • ENCRYPTED_CONTENT_STRING:加密内容字符串。

5. 加密 AES 密钥

AES 密钥加密公式:

copy
ENCYRPTED_AES_KEY=base64urlsafe_encode(rsa_encrypt($AES_KEY, $PUBLIC_KEY))

AES 密钥加密方法:

  • rsa_encrypt:用于加密 AES 密钥。有关更多信息,请参见 rsa_encrypt
  • base64urlsafe_encode:用于编码加密数据。有关更多信息,请参见 base64urlsafe_encode

输入参数:

输出参数:

  • ENCYRPTED_AES_KEY:加密 AES 密钥字符串。

6. 配置 header 和 body

    1. 配置 Encrypt header.。

在HTTP header Encrypt 字段中指定加密 AES 密钥,格式如下:

copy
Encrypt: algorithm=RSA_AES, symmetricKey=<ENCYRPTED_AES_KEY>
    1. 配置 Content-Type header。

内容格式设置为 text/plain:

copy
content-type: text/plain
    1. 配置 HTTP body。

加密内容字符串 (步骤 4 加密内容 获取的 ENCYRPTED_CONTENT_STRING)设置为 HTTP body。

消息解密

解密流程

下图展示了从 ZOLOZ 服务角度如何进行请求消息解密,以及从商户角度如何进行响应消息解密。

消息解密活动图.png

图 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 密钥解密公式:

copy
AES_KEY=rsa_decrypt(base64urlsafe_decode($ENCRYPTED_AES_KEY), $PRIVATE_KEY)

AES 密钥解密方法:

  • base64urlsafe_decode:用于解码加密数据。有关更多信息,请参见 base64urlsafe_decode
  • rsa_decrypt:用于解密密文。有关更多信息,请参见 rsa_decrypt

输入参数:

输出参数:

  • AES_KEY: 加密消息内容时随机生成的初始 AES 密钥。

5. 解密内容

内容解密公式:

copy
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 字符串。