<?php
|
|
//------------------------------------------------
|
// 签名加签函数PHP代码参考
|
//------------------------------------------------
|
|
class Signature
|
{
|
|
/**
|
* 签名
|
*
|
* @param string $data 原始数据
|
* @param string $rsaPrivateKey 私钥
|
* @param int $algo 加密算法
|
* @return string
|
*/
|
public static function sign($data, $rsaPrivateKey, $algo = OPENSSL_ALGO_SHA256)
|
{
|
$formatPrivateKey = self::formatRsaPrivateKey($rsaPrivateKey);
|
openssl_sign($data, $signature, $formatPrivateKey, $algo);
|
return base64_encode($signature);
|
}
|
|
/**
|
* 验签
|
*
|
* @param string $data 原始数据
|
* @param string $signature 签名数据
|
* @param string $rsaPublicKey 公钥
|
* @param int $algo 加密算法
|
* @return int|false 1 if the signature is correct, 0 if it is incorrect, and -1 on error.
|
*/
|
public static function verify($data, $signature, $rsaPublicKey, $algo = OPENSSL_ALGO_SHA256)
|
{
|
$rawSignature = base64_decode($signature);
|
$formatPublicKey = self::formatRsaPublicKey($rsaPublicKey);
|
return openssl_verify($data, $rawSignature, $formatPublicKey, $algo);
|
}
|
|
/**
|
* 格式化公钥
|
*
|
* @param string $publicKey
|
* @return string
|
*/
|
public static function formatRsaPublicKey($publicKey)
|
{
|
return "-----BEGIN PUBLIC KEY-----\r\n" . wordwrap($publicKey, 64, "\r\n", TRUE) . "\r\n-----END PUBLIC KEY-----";
|
}
|
|
/**
|
* 格式化私钥
|
*
|
* @param string $privateKey
|
* @return string
|
*/
|
public static function formatRsaPrivateKey($privateKey)
|
{
|
return "-----BEGIN RSA PRIVATE KEY-----\r\n" . wordwrap($privateKey, 64, "\r\n", TRUE) . "\r\n-----END RSA PRIVATE KEY-----";
|
}
|
|
/**
|
* 生成payload - 用于x7手游通用接口
|
*/
|
public static function genPayload($apiMethod, $appkey, $datetime, $body, $gameType, $method = "POST")
|
{
|
$payload = $method . " " . $apiMethod . "@" . $appkey . "#" . $gameType . "." . $datetime . "\n\n" . $body;
|
return $payload;
|
}
|
}
|
|
function Test()
|
{
|
$httpMethod = "POST";
|
$apiMethod = "x7mall.mallEntry";
|
$appkey = "0b9ce7b64b02fb17cc948c0b9a6eb462";
|
$reqTime = "2021-01-13T14:54:52+0800";
|
$gameType = "client";
|
$bizParams = '{"role":{"roleId":"","guid":"","roleName":"","serverId":"","serverName":"","roleLevel":"","roleCE":"","roleStage":"","roleRechargeAmount":""}}';
|
|
//RSA密钥对,可以从签名助手页面获取测试秘钥对
|
$rsaPrivateKey = "MIIEpAIBAAKCAQEAg14NcreEPJCZbyKsqvHG5aBlaw98l4pTnCuQcKbFjJ1CvaeJ0VJucskYj2MNrAhTuDDR8ogofA47YElH+0mkpiaadqDH31thII8dng9qrp69nXqSeFQdvj4307aYsixmRjQ+latAY3mEhRrkGByKLeRnGyQ0PlcAyJbOkPBzazYAAmKPETfND7c+E6+fKJw683dKaPBAW9LWr/7aygFfyjjJSwuc721oUcDVJOlJsC9NiZqElfBEQ13mKOnHZ/GPkFYSVqaWTmAuN5JXy/Cdo98DpD62LY3pIv4YkMhJq5rgfkgug6snjLlavYWOi9hCpIcei0XPd43GajaXa+7E4QIDAQABAoIBAC3z34ZqdaJt/o4mtfnSO34lvnRV5YJpC9hMUOlnHSGT/T20dnw3dpVGjQXTY3vzKb37reVGBctnexOybrCTUTohtNScZ25VW8N07KpWwD23H6MPtl7LJeBfiU3QyNdCusACFIZsckiZwGaDQpjAmwF0rTCMWI4aBxcj0bxXsDgnF++ryFPNU5hVE0jk1DuUeiOBjXxWstZaXzjKWRTD/MY7sWLgjvKYcxU4Pj+sUJogPjR5UMK8SkF74mX/lptxK9ZR94c94cVMSJxYhLhLng/QX3exfr22PQi5YFoj3W/TWkN7SehUxnCDeK7DEvhFyo6pBufUy9KwIwtrbQevGcECgYEA3hJdb4DpMt2bQJwJ8wFQXQBQy0Rg+0sDdrUV55pBVfY27jethClXxYnYs6i4IWkw91ufszz5/XqcXq96xQ0sItloJDLlH/DYcMlV+Bc9dyL9roP4+ZKgrHRnUbEtmxPxYKf3VlEeuE8ORzT4q0+NmOIxfAP+5hxYexB3rxw1gxkCgYEAl3ASyqIfPUIDvW/frs6ANYrx3g0S3n9hwTVC9Mg4tmXuLxxp0BCQHhELxSiXOCEbKm5Zz8AFMgzFjPKJyq0j7TS8wMzIoZ+rvi7UOyip7C9yWm34xRysry/w7+fmFdVZohC+6WvFY1V0Y9qbaFRNlF6bp+a5L46NxbMTRJqskQkCgYEAz8TW7m/pvtFfY/+Zv2XHTnvxG3yKUBJK11FtgRbtcgO+OPqWuUQE/qiNuulr/LZyPbvXmta9/c4tZtk/QAWm+aP2r4d+n3eyyTNV35u+wixWtGR9GON6uF7gG6ptRN5Pw2LjIjsbRs2QSkbhMUZo8FUQfzstzRVQIzOxBoCaAGECgYBIFwP7Dl5MrQZWwdD7yDXkRzaIfDTFUmJYtWAgYsgMnE1cg+wjLh9NENRHkOEbyTbDZjC+4ywV/Vp1lGff4bg+jWJlbZb8yaPaLzS8zMjHNHb9cWiBfPr/kpThv8UaE6xNqCcZu0IF3YJAnqpoaelcfgUfUohJiVUYDf1YJUGM8QKBgQCVheFKMbRbHdprov7W/IpNJjzCFBSL1pMGwxCGkkboBsC3oXNwcuGVk6r07ewJoTeRKhFA6E6OhMHNlycWqfC88lah02td/3zRAOO61a+2kvkW6LeQjwLHsrm+KiNhTsLAKIJ/Tv9su1cJxHVFXqM/ZR0pbyeeE6oa0nnD3Et1ww==";
|
$rsaPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg14NcreEPJCZbyKsqvHG5aBlaw98l4pTnCuQcKbFjJ1CvaeJ0VJucskYj2MNrAhTuDDR8ogofA47YElH+0mkpiaadqDH31thII8dng9qrp69nXqSeFQdvj4307aYsixmRjQ+latAY3mEhRrkGByKLeRnGyQ0PlcAyJbOkPBzazYAAmKPETfND7c+E6+fKJw683dKaPBAW9LWr/7aygFfyjjJSwuc721oUcDVJOlJsC9NiZqElfBEQ13mKOnHZ/GPkFYSVqaWTmAuN5JXy/Cdo98DpD62LY3pIv4YkMhJq5rgfkgug6snjLlavYWOi9hCpIcei0XPd43GajaXa+7E4QIDAQAB";
|
|
//生成payload
|
$payload = Signature::genPayload($apiMethod, $appkey, $reqTime, $bizParams, $gameType, $httpMethod);
|
|
//生成签名
|
$signature = Signature::sign($payload, $rsaPrivateKey);
|
|
//签名校验
|
$passed = Signature::verify($payload, $signature, $rsaPublicKey);
|
|
echo "--------------------------------------------------------------", "<br/>";
|
echo "payload=", $payload, "<br/>";
|
echo "--------------------------------------------------------------", "<br/>";
|
echo "signature=", $signature, "<br/>";
|
echo "--------------------------------------------------------------", "<br/>";
|
echo "passed=", $passed ? "true" : "false", "<br/>";
|
}
|