API接口使用AES加解密对接
1. 实现方案
AES+sha256
加密签名认证方案,使用AES对请求参数和响应数据做加密处理, 对请求参数和响应数据做sha256
摘要签名。1.1 AES加密参数
airudderredduria
,实际生产使用的密钥请先和我们联系。加密模式 ECB
填充 zeropadding (\0)
示例中使用python语言,实际语言 可自行选择。
def aes_encrypt(text, aeskey):
"""aes加密"""
if isinstance(text, str):
text = text.encode("utf8")
enc_secret = AES.new(aeskey.encode("utf-8"), AES.MODE_ECB)
# ECB的一种填充方式。 ECB要求输入明文长度必须是块长度的整数倍,因此text必须填充至满足要求。本文档里约定使用 "\0" 进行补位。
tag_string = text + (AES.block_size - len(text) % AES.block_size) * b"\0"
cipher_text = base64.b64encode(enc_secret.encrypt(tag_string))
return cipher_text
def aes_decrypt(text, aeskey):
"""aes解密"""
if isinstance(text, str):
text = text.encode("utf8")
dec_secret = AES.new(aeskey.encode("utf-8"), AES.MODE_ECB)
raw_decrypted = dec_secret.decrypt(base64.b64decode(text))
clear_val = raw_decrypted.rstrip(b"\0")
return clear_val
1.2 sha256签名方式
utf-8
编码,取其sha256
摘要的16进制的小写值示例中使用python语言,实际语言可自行选择。
def sha256_sign(text):
"""sha256签名"""
if isinstance(text, str):
text = text.encode("utf8")
return hashlib.sha256(text).hexdigest()
2. 加密请求数据和解密响应数据
2.1 对接方需要在请求里作以下处理后在发送请求
Is-Encrypted
1 标记是否加密.请求HEADER里添加
Signed
xxx 标记sha256的签名值{
"Is-Encrypted": "1",
"Signed": "6956d7af4c89b89f19f9ae0a8be4bcf12abe7c6ed893691733f3480ad3f3aabc"
}
GET请求的原始加密数据是 所有参数进行urlencode后的值(即query_string)
POST请求的原始加密数据是 参数jsondumps后的值 (即body)
*.对原始加密数据进行加密处理后变成加密数据,替换原始加密数据, 计算出原始加密数据的
sha256
签名值放到header中。在发送请求即可2.2 如果请求是加密请求,则响应也对应的是加密响应,对接方按以下方式解密
Is-Encrypted
1 标记是否加密.响应HEADER里添加
Signed
xxx 标记sha256的签名值*.对加密的响应数据进行解密后生成原始响应数据,对此原始响应数据进行sha256签名并与HEADER里Signed值进行比较,一致后在进行后续处理即可。
修改于 2023-01-11 06:14:11