Heim > Backend-Entwicklung > PHP-Tutorial > Implementieren Sie SHA1 mit RSA-Signatur, Verschlüsselung und Überprüfung mit PHP

Implementieren Sie SHA1 mit RSA-Signatur, Verschlüsselung und Überprüfung mit PHP

little bottle
Freigeben: 2023-04-05 22:24:01
nach vorne
9579 Leute haben es durchsucht

Ich habe einen PHP-Signaturverschlüsselungscode gesehen, der von einem PHP-Experten im Internet geteilt wurde. Wenn Sie interessiert sind, kommen Sie bitte vorbei und erfahren Sie mehr darüber.

Konzepterklärung:

Der sichere Hash-Algorithmus SHA1 ist hauptsächlich auf den im Standard für digitale Signaturen definierten Algorithmus für digitale Signaturen anwendbar.

RSA ist derzeit der einflussreichste Public-Key-Verschlüsselungsalgorithmus. Er kann den meisten bisher bekannten kryptografischen Angriffen widerstehen und wurde von der ISO als Public-Key-Datenverschlüsselungsstandard empfohlen.

SHA1WithRSA: Verwenden Sie den SHA-Algorithmus für die Signatur und den RSA-Algorithmus für die Verschlüsselung.

Geschäftsanforderungen:

Der durch jede Signatur zusammengestellte Inhalt wird in aufsteigender Wörterbuchreihenfolge der Feldnamen sortiert und verbunden.

Stellen Sie den Inhalt zusammen, der zuerst signiert werden muss:

/**
     * 拼接需要签名的内容
     * Author: Tao.
     *
     * @param array $data 需签名的字段内容
     * 
     * @return string
     */     
    public static function getSign($data)
    {
        foreach ($data as $k => $v) {
            $Parameters[$k] = $v;
        }
        //按字典序排序参数
        ksort($Parameters);
        $sign = '';
        foreach ($Parameters as $k => $v) {
            $sign .= $k . "=" . $v . "&";
        }
        $sign = '&' . rtrim($sign, '&');
        return $sign;
    }
Nach dem Login kopieren

Die Signaturzeichenfolge lautet wie folgt:
&amount=amount value&ccy=ccy value&merchantId=merchantId value¬ifyUrl=notifyUrl value&orderId=orderId value&payeeAcctNo=payeeAcctNo value (einfacher Text).

Es ist zu beachten, dass Sie je nach Geschäftsanforderungen wählen können, ob das kaufmännische Und vor dem Signaturinhalt gespleißt werden soll.

Generieren Sie dann die Signatur des geheimen Schlüssels:

/**
     * 秘钥加密
     * Author: Tao.
     *
     * @param string $data 之前生成好的需加密内容
     * @param $key 私钥证书位置(.pfx文件)
     * @param string $pwd 证书密码
     *
     * @return string
     */
    public static function SHA1withRSA($data, $key,$pwd)
    {
        openssl_pkcs12_read(file_get_contents($key), $certs, $pwd); 
        if (!$certs) return;
        $signature = '';
        openssl_sign($data, $signature, $certs['pkey']);
        return bin2hex($signature);  
    }
Nach dem Login kopieren

Da das Drittunternehmen eine Konvertierung in Hexadezimalzahl erfordert, können Sie je nach Bedarf bin2hex() oder base64_encode() wählen.

Hier ist zu beachten, ob bei den signierten Inhalten entsprechend den Geschäftsanforderungen zwischen Groß- und Kleinschreibung unterschieden werden muss.

Der signierte Inhalt sollte in Kleinbuchstaben vorliegen und kann mit strtoupper() in Großbuchstaben umgewandelt werden.

Das Obige ist die Verschlüsselungsmethode mit privatem Schlüssel, die für alle zusammengestellt wurde.

Dieses Geschäft erfordert jedoch auch, dass die Bankkartennummer mit dem öffentlichen RSA-Schlüssel verschlüsselt werden muss
Die folgende Methode ist die Methode zum Erhalten des öffentlichen Schlüssels:
Hier erhalten Sie den öffentlichen Schlüssel des Plattformzertifikats der anderen Partei (.cer-Datei)


/**
     * 获取公钥
     * Author: Tao.
     *
     * @param $path //公钥证书位置 (.cer文件)
     *
     * @return mixed
     * @throws \Exception
     */
    public static function loadCert($path)
    {
        $file = file_get_contents($path);
        if (!$file) {
            throw new \Exception('loadx509Cert::file_get_contents ERROR');
        }

        $cert = chunk_split(base64_encode($file), 64, "\n");
        $cert = "-----BEGIN CERTIFICATE-----\n" . $cert . "-----END CERTIFICATE-----\n";

        $res = openssl_pkey_get_public($cert);
        $detail = openssl_pkey_get_details($res);
        openssl_free_key($res);

        if (!$detail) {
            throw new \Exception('loadX509Cert::openssl_pkey_get_details ERROR');
        }
        return $detail['key'];
    }

    /**
     * 公钥加密
     * Author: Tao.
     * 
     * @param $pubPath  //公钥证书位置 (.cer文件)
     * @param string $bankCode //银行卡号
     * 
     * @return string
     */
    public static function rsa_encode($bankCode,$pubPath)
    {
        $pubkey = self::loadCert($pubPath);
        $encrypt_data = '';
        openssl_public_encrypt($bankCode, $encrypt_data, $pubkey);
        $encrypt_data = base64_encode($encrypt_data);
        return $encrypt_data;
    }
Nach dem Login kopieren

Sie müssen mich fragen, warum der private Schlüssel bin2hex() ist und der öffentliche Schlüssel wird in base64_encode() geändert. Ich weiß nicht warum, und es hieß, es seien 16 Bit, aber das Anfordern einer Signatur scheiterte immer wieder, ich änderte es auf 64 und es gelang. Die Gegenpartei meinte, das Dokument sei zu alt und vergessen worden. . Wählen Sie entsprechend Ihren Anforderungen

Endgültige Signaturüberprüfung des Rückrufergebnisses

Nehmen Sie zunächst den Inhalt des zusammengestellten Signaturfelds in den Rückrufdaten heraus und sortieren Sie ihn gemäß der oben genannten getSign()-Methode .
Dann überprüfen Sie:

/**
     * 验证返回的签名是否正确
     *
     * @param string $data 要验证的签名原文
     * @param string $signature 签名内容
      *@param $pubPath  公钥证书位置 (.cer文件)
     *
     * @return bool
     */
    public static function verifyRespondSign($data, $signature,$pubPath)
    {
        $keys = self::loadCert($pubPath);
        $signature = hex2bin($signature);
        $ok = openssl_verify($data, $signature, $keys);
        if ($ok == 1) {
            return true;
        }
        return false;
    }
Nach dem Login kopieren

Ich hoffe, es hilft Ihnen, wenn etwas nicht stimmt, weisen Sie es bitte rechtzeitig darauf hin, ändern Sie es und lernen Sie voneinander. Verwandte Tutorials: PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonImplementieren Sie SHA1 mit RSA-Signatur, Verschlüsselung und Überprüfung mit PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:cnblogs.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage