php实现rsa签名和验签
这两天在弄某支付接口相关的东西,以前没做过这块,在签名和验签的过程中遇到了一些问题,记下来. 首先生成一个1024位的私钥: openssl genrsa -out private.pem 1024 然后根据私钥导出公钥 openssl rsa -in private.pem -pubout -out public.pem php的openssl扩
这两天在弄某支付接口相关的东西,以前没做过这块,在签名和验签的过程中遇到了一些问题,记下来.
首先生成一个1024位的私钥:
<code>openssl genrsa -out private.pem 1024 </code>
然后根据私钥导出公钥
<code>openssl rsa -in private.pem -pubout -out public.pem </code>
php的openssl扩展里已经封装好了签名和验签的方法,分别是openssl_sign和openssl_verify.
<code>function sign($data){ $p = openssl_pkey_get_private(file_get_contents('private.pem')); openssl_sign($data, $signature, $p); openssl_free_key($p); return bin2hex($signature); } function verify($data, $sign){ $p = openssl_pkey_get_public(file_get_contents('public.pem')); $verify = openssl_verify($data, hex2bin($sign), $p); openssl_free_key($p); return $verify > 0; } </code>
实际情况是测试接口并没有提供公私钥,而是提供了公/私钥指数,模数.通过java的RSAPrivateKeySpec和RSAPublicKeySpec来实现签名和验签,遂写了一个jar用命令行来调用:
<code>package org; import java.math.BigInteger; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.Signature; import java.security.spec.RSAPrivateKeySpec; import java.security.spec.RSAPublicKeySpec; /** * @author eslizn * */ public class SignVerify { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { if(args.length == 4 && args[0].equals("sign")){ System.out.println(Sign(args[1], new BigInteger(args[2], 16), new BigInteger(args[3], 16))); System.exit(0); } if(args.length == 5 && args[0].equals("verify")){ System.out.println(Verify(args[1], args[2], new BigInteger(args[3], 16), new BigInteger(args[4], 16)) ? "1" : "0"); System.exit(0); } } /** * Sign * * @param data * @param mod * @param exp * @return * @throws Exception */ public static String Sign(String data, BigInteger mod, BigInteger exp) throws Exception{ RSAPrivateKeySpec spec = new RSAPrivateKeySpec(mod, exp); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey signKey = keyFactory.generatePrivate(spec); Signature signature = Signature.getInstance("SHA1withRSA"); signature.initSign(signKey); signature.update(data.getBytes()); return byteArray2HexString(signature.sign()); } /** * Verify * * @param data * @param sign * @param mod * @param exp * @return * @throws Exception */ public static boolean Verify(String data, String sign, BigInteger mod, BigInteger exp) throws Exception{ RSAPublicKeySpec spec = new RSAPublicKeySpec(mod, exp); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); java.security.PublicKey verifyKey = keyFactory.generatePublic(spec); Signature verifier = Signature.getInstance("SHA1withRSA"); verifier.initVerify(verifyKey); verifier.update(data.getBytes()); return verifier.verify(hexString2ByteArray(sign)); } public static byte[] hexString2ByteArray(String hexStr){ if (hexStr == null) return null; if (hexStr.length() % 2 != 0) return null; byte data[] = new byte[hexStr.length() / 2]; for (int i = 0; i = '0' && c = 'a' && c = 'A' && c </code>
巧合的是写完后通过沟通,对方要我们自行生成一对公私钥后将其中的公/私钥指数和模数发给他们.有的时候可能有的办法比技术实现更方便.附上取公/私钥指数和模数的代码:
<code>function getPrivate($file){ $p = openssl_pkey_get_private(file_get_contents($file)); $res = openssl_pkey_get_details($p); var_dump($res); openssl_free_key($p); return array( 'n' => bin2hex($res['rsa']['n']),#模数 'e' => bin2hex($res['rsa']['e']),#公钥指数 'd' => bin2hex($res['rsa']['d']),#私钥指数 ); }</code>

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

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

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

ホットトピック











PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。
