PHP の専門家がインターネット上で共有している PHP 署名暗号化コードを見つけましたので、共有したいと思います。ご興味がございましたら、ぜひお越しください。
概念の説明:
SHA1 セキュア ハッシュ アルゴリズムは、主にデジタル署名標準で定義されているデジタル署名アルゴリズムに適用されます。
RSA は、現在最も影響力のある公開キー暗号化アルゴリズムです。これまでに知られているほとんどのパスワード攻撃に対抗でき、公開キー データ暗号化標準として ISO によって推奨されています。
SHA1WithRSA: 署名には SHA アルゴリズムを使用し、暗号化には RSA アルゴリズムを使用します。
ビジネス要件:
各署名によって組み立てられたコンテンツは、フィールド名の辞書の昇順にソートされて接続されます
最初に署名が必要なコンテンツを組み立てます:
/** * 拼接需要签名的内容 * 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; }
署名文字列は次のとおりです:
&amount=金額値&ccy=ccy値&merchantId=merchantId値¬ifyUrl=notifyUrl値&orderId=orderId値&payeeAcctNo=payeeAcctNo値(プレーンテキスト)。
ビジネス ニーズに応じて、署名コンテンツの前にアンパサンドを結合するかどうかを選択できることに注意してください。
次に、秘密鍵の署名を生成します:
/** * 秘钥加密 * 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); }
サードパーティ企業は 16 進数への変換を必要とするため、必要に応じて bin2hex() または Base64_encode() を選択できます。
ここで注意すべき点は、ビジネス ニーズに応じて、署名されたコンテンツの大文字と小文字を区別する必要があるかどうかです。
署名されたコンテンツは小文字である必要があり、strtoupper() を使用して大文字に変換できます。
上記は、誰でも使えるようにまとめた秘密鍵暗号化方式です。
ただし、このビジネスでは、銀行カード番号を RSA 公開キーで暗号化する必要もあります。
公開キーを取得する方法は次のとおりです:
ここでは、相手のプラットフォーム証明書 (.cer ファイル) の公開キーを取得します。
/** * 获取公钥 * 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; }
秘密キーが bin2hex() である理由を尋ねる必要があります。公開鍵はbase64_encode()に変更されます。理由がわかりません。尋ねると、16 ビットであると言われましたが、署名の要求は失敗し続けました。64 ビットに変更したところ、成功しました。相手は書類が古すぎて忘れられていると言いました。 。必要に応じて選択してください
最終的なコールバック結果の署名検証
まず、コールバック データ内の組み立てられた署名フィールドの内容を取り出し、上記の getSign() メソッドに従って並べ替えます。 。
その後、確認してください:
/** * 验证返回的签名是否正确 * * @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; }
お役に立てば幸いです。何か間違っている場合は、指摘して修正し、お互いに学び合ってください。関連チュートリアル: PHP ビデオ チュートリアル
以上がPHP を使用して SHA1withRSA 署名、暗号化、検証を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SublimeText3 中国語版
中国語版、とても使いやすい

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック



