現在、開発にフロントエンドとバックエンドの分離モデルを使用するプロジェクトが増えています。バックエンド開発者は API インターフェイスを使用して、処理と表示のためにデータをフロントエンド開発者に転送します。金銭やユーザー情報などが関与する、より重要なデータ インターフェイスの変更では、インターフェイスが保護および検証されていない場合、誰かが悪意を持ってインターフェイスを簡単にスワイプすることが多く、その結果、多大な損失が発生します。
ここでは、インターフェイスのパラメータを暗号化するための、業界でより一般的な署名検証を紹介します。これには次の利点があります。
要求された一意性: 計算された署名は一意であり、検証に使用できます。
パラメータの可変性: パラメータにはタイムスタンプ パラメータが含まれており、これによりリクエストごとに計算される署名が異なることが保証されます。
リクエスト エージング: リクエストには現在のリクエストのタイムスタンプ パラメーターが含まれているため、サーバーはタイムスタンプを確認し、エージング制限を超えるリクエストをフィルタリングできます。
セキュリティ: リクエストが悪意を持ってキャプチャされ、相手が悪意を持ってパラメータを改ざんした場合でも、署名は間違っており、パラメータは変更できません。
1. 署名されるマップ タイプのデータ (つまり、キーと値のペアのセット) を、鍵。マップ内のパラメータはアルファベット順に並べ替えられ、最初の文字が同じ場合は 2 番目の文字で並べ替えられます。たとえば、
{ "timestamp": "2017-06-08 09:38:00", "format": "xml", "app_id": "aabbc", "cp_extend_info": "", "sign_type": "HMAC-SHA1", "sign": "abc" }
は、並べ替え後に
{ "app_id": "aabbc", "cp_extend_info": "", "format": "xml", "sign_type": "HMAC-SHA1", "timestamp": "2017-06-08 09:38:00" }
になります。 注: マップに署名パラメータ (sign) が含まれる場合、パラメータのキー値フィルタリングが必要です。署名に参加してください。値のないパラメータの署名には参加しないでください。
2. ソートされたマップを署名対象の文字列にシリアル化します。署名対象の結合された文字列は次のとおりです。
app_id=aabbc&format=xml&sign_type=HMAC-SHA1×tamp=2017-06-08 09:38:00
3. キーを使用して、HMAC-SHA1 アルゴリズムに従って署名される文字列のダイジェスト (ハッシュ) 署名を抽出し、base64 エンコードします (明示的な送信と比較を容易にするため)。はテストであり、抽出されたダイジェスト署名は次のとおりです。base64_encode の値は
JqoEqPIVVor0eyRHMYiZftsycVo=
注: 一部のデータは HTTP プロトコルで必要とされるため、ネットワーク送信中に URL エンコーディングを実行する必要があります。受信者が正しいパラメータを受信できることは保証されますが、このパラメータが署名に関与する場合、署名される文字列は URLencoding の値ではなく、文字列の元の値である必要があります。
PHP の例
/** * 使用密钥生成HMAC-Sha1签名 * @param array $params 请求参数 * @param string $signKey 签名密钥 * @return string */ function hmacSha1Sign($params,$signKey) { ksort($params); $paramString = ''; foreach ($params as $key => $value) { if (is_null($value) || $value=='' || $key == 'sign') { continue; } $paramString .= $key.'='.$value.'&'; } $paramString = substr($paramString,0,-1); $sign = base64_encode(hash_hmac("sha1", $paramString, $signKey, $raw_output=TRUE)); return $sign; }
上記は、日常の開発でよく使用される API 検証署名方法です。さらにチュートリアルをご覧いただくために、フォローを歓迎します。
以上がAPI共通の署名検証方法(PHP実装)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。