签名
发送业务请求,必须对业务参数进行签名,签名密钥格式为PKCS8,长度为2048,签名步骤如下:
第 1 步 将所有业务参数按json格式存储并转换成Base64字符串,作为公共参数bizStr的值;
第 2 步 将前一步生成的base64字符串与应用私钥加签,生成Base64签名字符串,作为公共参数sign的值,signType值为固定值RSA2;
第 3 步 按照JSON格式组装公共请求参数,发送业务请求;
php 加签依赖OpenSSL扩展,伪代码:
// 私钥
$privateKey = "-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----";
$params = array(
'outOrderId' => 'xxxxxxxxx'
);
// 待签名的数据
$data = base64_encode(json_encode($params));
// 签名
openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
$signatureBase64 = base64_encode($signature);
echo $signatureBase64;
java 加签伪代码:
PrivateKey priKey = getPrivateKey();
Signature signature = Signature.getInstance("SHA256WithRSA");
signature.initSign(priKey);
signature.update(content.getBytes("utf-8"));
String sign= Base64.getEncoder().encodeToString(signature.sign());
验签
为了确保业务数据安全,接入方收到业务请求响应数据以及业务通知数据之后,需要对数据进行验签,防止数据被篡改,验签步骤如下:
第 1 步 响应数据/通知数据中字段 bizStr 为待验签数据;
第 2 步 使用平台公钥进行RSA2验签(平台公钥在创建商户应用时获得);
第 3 步 验签通过则为合法数据,否则为非法数据;
php 验签依赖OpenSSL扩展,伪代码:
// 公钥
$publicKey = "-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----";
// 待验证的数据
$data = "response bizStr ";
$signature = base64_decode(response sign);
// 验证签名
$is_valid = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
if ($is_valid === 1) {
echo "签名验证成功!";
} else {
echo "签名验证失败!";
}