私たちは、多くの場合、インタフェースを扱う開発プロセスは、インターフェースは時にはあなたのサイトには、他の人のためのインタフェースを提供することで、他の人にサイトの移転であるが、そのプロセスでは、署名検証の転送なしで行うことはできません。
私たちは署名検証を設計する場合、以下の点に注意してください。
-
変動:各署名は異なっている必要があります。
-
適時性:各要求は、高齢化、のように失効しました。
-
一意性:各署名は一意です。
-
整合性:改ざん入ってくるデータを検証する機能。
ここで紹介する一つの方法は、現在、淘宝網Alipayの支払インターフェース、淘宝網のオープンプラットフォームインターフェイス、テンセントは、アプリケーション・プラットフォームの道を開いているインターネット企業の一般的な方法です。
署名生成方法パラメータ記号
ステップ1:すべてのパラメータ(注すべてのパラメータという)記号自体を削除するには、空で、パラメータの値、パラメータ名はアルファベットの昇順にソート。
ステップ2:次に、パラメータは、パラメータの値によってソートのパラメータ2の値2 ...パラメータ値N N(送信パラメータの元の値でなければならないパラメータと値は、治療することができない場合に、そうでない場合"ターン「その後、スプライシングに)文字列にスプライスされます。
ステップ3:ステップ2で得られたスプライス検証鍵キーのアクセス側に割り当てられた文字のフロント。
ステップ2:その後、32ビットのビット列を取得MD5値を計算し、次に電源を入れ(割り当てられているアクセス正方形へのインターフェースを提供するインターフェースであるここで、鍵KEY)認証キーのキーを追加することによって得られた文字列の前にステップ大文字。
ステップ4:列(32)のステップ3 MD5計算された値は、符号の値として得られ、大文字の文字列を回します。
例えば:
パラメータは、記号に対応するsign_value署名である送信データは、/interface.php?sign=sign_value&p2=v2& P1 = V1&メソッド=値がキャンセル&P3 =&PN = VN(ポストを介して送信され、好ましくは現実)であると仮定する。
最初のステップ、文字列の連結は、まず自身のパラメータ符号を除去し、その値を除去することがnullパラメータP3であり、残りP2 = V2&P1 = V1&メソッド=キャンセル& PN = VN、およびその後の昇順に文字のパラメータ名を押し、方法=キャンセル&P1 = V1&P2 = V2&PN = VN。
第2のステップは、その後、ステッチパラメータ名と値を行い、最終的にmethodcancelp1v1p2v2pnvn取得
、我々はABCを前提とし、結果の文字列上記プラス認証キーのキースプライシングの前に、第三の工程を、新しい文字列abcmethodcancelp1v1p2v2pnvnを取得
第四の工程は、次にABCDEF仮定して計算この文字列MD5は、取得された後上部に、得られたABCDEFこの値は符号署名値です。
計算された署名の検証が失敗する場合は、パーティMD5計算にアクセスする前にインタフェース列コードすることを確認してください、統一コードまたはGBKのUTF-8でエンコードされ、コードとして使用すること矛盾しています。
第二に、署名検証方法:
ルールに従った方法は、生成された以前の符号シグニチャパラメータ、パラメータを計算した署名値を記載し、それが一致している場合に比較オーバー通知符号のパラメータに対応するパラメータ値は、次いで、チェックが渡され、そうでない場合、パラメータが記載されています修正しました。
第三には、直接以下のコードを見て
。1 <?PHP 2が // 公開鍵(キー)と秘密鍵(シークレット)を設定し、ユーザー公開鍵、データの秘密鍵暗号を区別するために、開示されていない 3。 $キー =「c4ca4238a0b923820dcc509a6f75849bを」; 。4 $シークレット =「28c8edde3d61a0411511d3b1866f0636」; 5 。6 // 送信すべきデータパケット 7件の。 $データ = 配列( 8 'ユーザ名' => '[email protected]'、 9 'セックス' =>」1' 10 '年齢' => '16'、 。11 'addrが' => '広州'、 12である 'キー' => $キー、 13 'タイムスタンプ' => 時間() 14 ); 15 16 // サインを取得し 17。 機能(getSign $秘密、$データ) 18である { 19。 // ソート済みキーの配列の値 20である ksort($データ) 21である // 生成されたURLの形態 22である $ paramsは = http_build_query($データ); 23はある // 生成されたサインオン 24 $サイン = MD5($ paramsは。$シークレット); 25 リターン $サイン; 26があります } 27 28 // データ送信プラス記号 29 $データ [ 'サイン'] = getSign($秘密、$データ); 30 31は、 / * * 32 *背景検証が正当な符号である 33である * @param [タイプ] $シークレット[説明] 34である [入力] $データ[説明] * @param 35 * @return [タイプ] [説明] 36 * / 37 [ 関数 verifySign($秘密、$データ) 38である { 39 // パラメータ署名検証か 40 IF(!ISSET(データ$ [ 'サイン'])||!$データ [ 'サイン' ]){ 41れる エコー '署名送信データが存在しない' ; 42である ダイ(); 43である } 44は、 IF!(ISSET($データ [ 'タイムスタンプ' !])|| $データ [ 'タイムスタンプ' ]){ 45 エコー 'パラメータ送信されたデータが不正です' ; 46である ダイ(); 47 } 48 // 検証要求10分間故障 49 IF(時間() - $データ [ 'タイムスタンプ']> 600 ){ 50 エコー'認証失敗、ください再送要求' ; 51である ダイ(); 52れる } 53で $サイン = $データ [ 'サイン' ]; 54は 解除($データ [ 'サイン' ]); 55 ksort($データ) 56であります $ params = http_build_query($データ); 57がされて // $秘密キーのクエリは、APIデータベースによって得られる 58 $ SIGN2 = MD5($ paramsは。$シークレット); 59 IF($サイン ==$ SIGN2 ){ 60 ダイ( '確認済み' ); 61である } ほかは{ 62は、 ダイ( '要求が不正である' ); 63である } 64 } 65 66 $ RES = verifySign($秘密、$データ); 67 エコー「<PRE > " ; 68 ますprint_r($ RES ); 69 エコー " <前> " ; 70 番出口; 71 >?
リンクします。https://mp.weixin.qq.com/s/5_3Zol1O0sxNjsfHKPdTXQ