PHPの開発は、APIの署名検証と不可分である、あなたはどのように設計していますか?

私たちは、多くの場合、インタフェースを扱う開発プロセスは、インターフェースは時にはあなたのサイトには、他の人のためのインタフェースを提供することで、他の人にサイトの移転であるが、そのプロセスでは、署名検証の転送なしで行うことはできません。

私たちは署名検証を設計する場合、以下の点に注意してください。

  • 変動:各署名は異なっている必要があります。

  • 適時性:各要求は、高齢化、のように失効しました。

  • 一意性:各署名は一意です。

  • 整合性:改ざん入ってくるデータを検証する機能。

     

ここで紹介する一つの方法は、現在、淘宝網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

おすすめ

転載: www.cnblogs.com/clubs/p/12424936.html