原创PHP实现后端对称解密和非对称解密两种方法

PHP 10 0 2026-04-08

PHP实现后端对称解密和非对称解密两种方法

对称解密:

//对称验签
    public function signature()
    {
        $pv$_POST;
        $SIGN_KEY = 'm17xjmf2b4evd52exh7v40dcveqzyko5'; // 和前端一致

        // 1. 时间戳过期判断(60秒)
        if (abs(time() - $pv['timestamp']) > 60) {
            return json(['code' => 401, 'msg' => '签名已过期']);
        }
        $clientSign = $_SERVER['HTTP_X_SIGNATURE']; //获取客户端签名
        if ($clientSign === '') {
            return json(['code' => 402, 'msg' => '签名失败']);
        }
        // 2. 排序拼接字符串
        ksort($pv);
        $str = http_build_query($pv, '', '&');

        // 3. 生成后端签名
        $serverSign = hash('sha256', $str . '&secretkey=' . $SIGN_KEY);
        // 4. 对比验证
        if ($serverSign === $clientSign) {
            return json(['code' => 200, 'msg' => '验签成功']);
        } else {
            return json(['code' => 403, 'msg' => '验签失败']);
        }
    }



非对称解密:

//非对称验签
    public function signature2()
    {
        // 私钥(后端保密)
        $PRIVATE_KEY = <<<EOD
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDaSRnGZ80Wu2wg
pRKlt1/94XaK+xB5uXGu5BFkOlygvd+vSxZwTDBn/mL62oP5/jxCPPIfrJUwgbz4
quW39fmMhjeUOphnL+q8xAbjLOf7fFoXDHGGnzKCy2qCzcXH5aU3H4+r2GgU95LQ
pUb8uky/LMTPXVjg2NU+16niaHHzftTX9zrKS4Sq28jBOwEOI5OGZbJ+Q/0Szzvi
1uEZosRTA01zFYa3UC7Dqc11bf6AQ8ANysLpFbRNbExDEIa3bb29qdoME5sUjJmI
2qRIEqF5QKFvptn65g8X0doQUVKaxULx6q4HzcHtPacp6y8Qo8SpOhO/h4uNX3Nl
kjvtwb7VAgMBAAECggEALhqWeRNfe9emJNb4s0uh2KuQMBaLCkqiuj+tdK/m9IRm
BE4ltR5CcxSFr1oL2fdantrkgNAgypf8Y8Ekt9AaHxYSExq1KcYzHB+DHORVMwa2
uHuGVtq0/m8cVfhEN85HMPdXjwIsKZGIzsy5y5NFtnMsNmgO556km5tNZGaO+tCB
AiX4ZwV+xaI5RR5hxOs5B6dTHoljHoDLPE024yDPfiwANiczVuWeKg8ZMt0HKCTO
xMUqgYnSc2MQFucFD8eVyD6mJcbfi0Pzj6kXGbe4WO3uzKmfB9SZ13fnYYX9MiR4
zh/VezfdbpvSlUYi7VES4Ogg2V04PbydGx6i49mI2QKBgQD49dMPkqUCLwLw3Jyy
Q5QGbPuCNhQ+q5qPPAswwNE9Mw0Yg/KbpahfTfOT6f61w08w4gw8mmPrQ3whqhC1
Ev+gEgje7jVWGH0yGi0PSoSLUl87En4odte+g/PDDAnd9TNesOyl4ElAe24qoP6O
QupI+lY1mqLbi2OLK/03QfkzJwKBgQDgdTpaGdbbpKCagPCXc0kgE6zKkKziLGUi
elOjUg4ap8HcRNm6BRk8UvS2dPD3fSZwvKGAczvBBuCHoBSk8ejtVEDNdusndwVA
+Jj3Eeu0RG3s9JVozkylppaviE3XZ5UqhY7QSB3saFrpmELrYh+3fpnbhvyNeryj
/EJiijCLowKBgC705rc0OI094rcdVSzGVEAWBCYeHxlm8oL7lzy90XlSjLDIClVT
HHvFTyDh7JnJ2cDlkdtIX3o7Q0lyMy6EA9TkMeoiUcsIWWy+xSryKifBBJc2uLbX
G4AikTKDrcTAf8znX+s1b3uLDE9cCEc61cen9+SqYvc3xjG0vVDTz7XXAoGBAJXS
ifWUY89OjwkyYeWlxTzNBTxc35lEqukdn/BXGCUAryz5JB+/wX17ne6gFiwMdHkx
39dek5cfoQXGe6Ex/BlWcL70zrgUAQTCK1BXvO4h8wIErCo98flsPg7Cu7q5YF72
sUIjsR2Y9n4P7TMy1xrjPY3EB5XkREBtZF5kAU1jAoGBAM5PG+LghP5rbOCSVSoq
/nG0jFIoqrckEL5QtwsOFr/6/R+lJpfLF+Mvs4VKz94vOGGkRGDR0fH7Ev/LCjY3
tcZwU2BPc8AQsE0Xe76ZYOLinBuc/JAKNaTeCyuQDJwInJCuJOuy0cKgYzzDPNF0
hwOf1OONVkvTakW6Go7u84QB
-----END PRIVATE KEY-----
EOD;

        $pv$_POST;
        // 1. 时间戳过期判断(60秒)
        if (abs(time() - $pv['timestamp']) > 60) {
            return json(['code' => 401, 'msg' => '签名已过期']);
        }

        // 排序
        ksort($pv);
        $paramStr = http_build_query($pv, '', '&');

        $clientSign = $_SERVER['HTTP_X_SIGNATURE'] ?? ''; //获取客户端签名
        if ($clientSign === '') {
            return json(['code' => 402, 'msg' => '签名失败']);
        }

        // ==========================
        // 正确验签(无任何报错)
        // ==========================
        $key = openssl_pkey_get_private($PRIVATE_KEY);
        openssl_private_decrypt(base64_decode($clientSign), $decryptedHash, $key);
        $serverHash = hash('sha256', $paramStr);
        $verify = $decryptedHash === $serverHash ? 1 : 0;

        if ($verify) {
            return json(['code' => 200, 'msg' => '验签成功']);
        } else {
            return json(['code' => 403, 'msg' => '验签失败']);
        }
    }



前端如何加密,请点击下面连接查看

vue3实现前端进行对称加密和非对称加密两种方法


上一篇:PHP8+TP8+think-image处理图片错误(Implicit conversion from float 848.5 to int loses precision)解决方法

下一篇:没有了

讨论数量:0

请先登录再发表讨论。 2026-04-08

天涯网魂
3 杠 5 星
TA 的文章
TA 的随言
TA 的资源链