php7.0以上版本 mcrypt拓展无法使用导致小程序登录数据无法解密

在PHP7.0及以上版本中,mcrypt扩展已废弃,导致微信小程序的用户登录数据解密出现困难。本文分享了遇到的坑以及加密解密的数据示例,供开发者测试和解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

巨坑:微信小程序用户信息加密解密(贴出数据方便大家测试)

<?php
$appid = 'wx9bc23a213818b5d6';
$iv    = 'aPsEWbOPfJIkhox5SEJ2Fg==';
$encryptedData = 'W7qZC6qhy0q+8N0L87GpD9iasN3KgVMY7Vo9qTQvNObcOd21D3D5+dkjIAx+AmMtRRNFESt3tSxbRhQmuwUGd918AEY1hfcRkjXWIC0+vEfFYqg2faMC/QbxXiUI/QDpmfiG91StQqaq/Q9oai1uFvMjoAy+pReJ2jSau7YqcWSoAqm1kJSZjMMPkMk7O1kYniz/2Lj8rXvxhdqfkyyTlNzO/vMe9odRZy3ShBfcAnWMghH9pgSE3/qIk/aYGpc44oEXNNRE5donsmoIx0ZeUa5cUjsnfx/XUtIAK5fz4h/5AuebPLOZIWhB+NQR7VFgHt0QNyT7L5XdZNkIy4nmn4iQd9zWYS2OuTuJZW6Qr7BEJGbh7lfr24Y6iZjLVEzKwAOoY41OcDUED543y0hcX
        oWk9l0QInlCLYxBPZ4gELxPAJRmGuwjN2CRaJz0F61PqLGhzq9ih1uAkPbIvnoHWC5blWuVRxc+3N8E3hGst6bAz7e1rIWb3HJSooSa67Jl';
$sessionKey = '9yjhuwVi9qYKnNpqw9sgVg==';

$pc = new WXBizDataCrypt($appid, $sessionKey);  //这里的解密规则可以看文档,仔细看过就能懂(已经理解过)
$errCode = $pc->decryptData($encryptedData, $iv, $data);

下面是要修改的文件类:WXBizDataCrypt.php中方法

    /**
     * 检验数据的真实性,并且获取解密后的明文.
     * @param $encryptedData string 加密的用户数据
     * @param $iv string 与用户数据一同返回的初始向量
     * @param $data string 解密后的原文
     *
     * @return int 成功0,失败返回对应的错误码
     */
    public function decryptData($encryptedData, $iv, &$data)
    {
        if (strlen($this->sessionKey) != 24) {
            return ErrorCode::$IllegalAesKey;
        }
        $aesKey = base64_decode($this->sessionKey);
        if (strlen($iv) != 24) {
            return ErrorCode::$IllegalIv;
        }
        $aesIV = base64_decode($iv);
//        $aesCipher = base64_decode($encryptedData);
        $aesCipher = $encryptedData;
        $pc = new Prpcrypt($aesKey);
        $result = $pc->decrypt($aesCipher, $aesIV);
        if ($result[0] != 0) {
            return $result[0];
        }
        $dataObj = json_decode($result[1]);
//        echo "<pre>";print_r($dataObj);die;
        if ($dataObj == NULL) {
            return ErrorCode::$IllegalBuffer . '--';
        }
        if ($dataObj->watermark->appid != $this->appid) {
            return ErrorCode::$IllegalBuffer . ';;';
        }
        $data = $result[1];
        return ErrorCode::$OK;
    }

还有解密的方法类:PKCS7Encoder.php 中的class Prpcrypt

/**
 * Prpcrypt class
 *
 *
 */
class Prpcrypt
{
    public $key;

    function __construct($k)
    {
        $this->key = $k;
    }

    /**
     * 对密文进行解密
     * @param string $aesCipher 需要解密的密文
     * @param string $aesIV 解密的初始向量
     * @return string 解密得到的明文
     */
    public function decrypt($aesCipher, $aesIV)
    {
        try {
            $decrypted = openssl_decrypt($aesCipher, 'AES-128-CBC', $this->key, OPENSSL_ZERO_PADDING, $aesIV);
        } catch (Exception $e) {
            return array(ErrorCode::$IllegalBuffer, null);
        }
        try {
            //去除补位字符
            $pkc_encoder = new PKCS7Encoder;
            $result = $pkc_encoder->decode($decrypted);
        } catch (Exception $e) {
            return array(ErrorCode::$IllegalBuffer, null);
        }
        return array(0, $result);
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值