私のチームと私は、ミドルウェア層に対して、セキュリティのために公開鍵と秘密鍵でリクエストに署名するように要求するAPI /ミドルウェアシステムを開発しています。これらのリクエストのほとんどは、ミドルウェアから直接データを照会するiPhoneやAndroidアプリなどのモバイルアプリケーションを除いて、サーバー間で行われます。API /ミドルウェア認証済み通信 - リクエストの整合性チェック
私たちは、AmazonマーケットAPIがソートされたクエリ文字列を使用して動作する方法を非常に密接に反映させ、同じアルゴリズムを使用して受信時に比較される署名を生成するために公開鍵と秘密鍵でHMAC 256ハッシュを行いました。
残念ながら、私たちはアプリストアからiPhoneアプリをリリースするには、暗号ライブラリを実装するために特定の政府基準を満たす必要があることを少し遅らせた(ゲームの遅い段階で)。今私たちは、署名文字列に秘密鍵を追加し、比較のためにハッシュしたSHA1()のようなもっと単純なメソッドを使うために署名アルゴリズムを書き直す必要があるかどうかを強制的に決定しています。
私は非常に安全な方法を採用し、それを秘密鍵でハッシングするだけでは嫌いですが、HMAC 256を落とすことで、私が長期的に失っていることを知るにはセキュリティと暗号にはあまり慣れていません。たとえば、次の文字列がすでに公開鍵を含むクエリ)
は、我々は現在、私たちのクエリ文字列を注文し、それに署名するために、このように操作を行います。
$signature = base64_encode(hash_hmac('sha256', $querystring, $private_key, TRUE));
我々は暗号クラスを使用しないことを余儀なくされている場合私たちのアプリケーションでは、署名は次のようになります:
技術的には、このアプリでライブラリを使用する基準を満たしている可能性がありますが、私たちが行っていることが正確には合致しないと米国政府が判断した場合、 「認証」の法的説明。
あなたからのアドバイスはありますか? 2番目のコード例を使用して失うのは、ミドルウェアを簡単にハッキングすることですか?
hmac 256は暗号化の方法ではありません。また、メッセージダイジェスト関数は暗号化関数ではありません。彼らはもっと違うことはできませんでした。 – rook
ありがとうございます。私の用語の誤用を許して、私は確かにセキュリティの用語に精通していない(これが私がこの質問をする理由である)。私が達成しようとしていることの精神を踏まえれば、最終的な目標は受信側のデータの完全性チェックであるという点で、2つの実装に大きな違いがあるのでしょうか? – Shane
私は最初のパラメータとして 'sha1'を渡すだけでhash_hmac関数を使います。 hmacは単なる連結ではなく、下線付きハッシュ関数が脆弱であっても、衝突の影響を受けないなど、興味深いプロパティをhmacsに与えます。この場合、sha1は衝突に対して持続可能ですが、これはあなたに影響することはありません。また、この質問は、暗号スタック交換に合わせたものです。 – rook