私は現在、iPhoneクライアントにデータを提供するWebアプリケーションを開発しています。データの所有者になるために、他のクライアントがデータを取得できないようにします。
サーバーとクライアント間で共有秘密鍵を使用できると思いました。ハードコードされた文字列で、タイムスタンプをソルトして、要求がクライアントの1つによって行われたことを確認します。したがって、リクエストは次のようになります。
http://domain.com/request/[desired_object_id]/[device_id]/[timestamp]/[hash]
私はアプリで次のようにハッシュを計算します:
hash = sha(desired_object_id + device_id + timetsamp + "mysecretkey")
サーバー側では、データを送信する前にハッシュが適切に生成されていることを確認します。 (「desired_object_id」で識別されるすべてのオブジェクトは、すべてのサブスクライバーが使用できます)。別の方法として、タイムスタンプではなくランダムキーを生成することもできます。
問題は、それが私には安全に聞こえないということです...データは重要ではありません、それは私が非加入者によって使用されるパブリックAPIを提供したくないということだけです。また、これを行うと、ユーザーが新しいクライアントバージョンに更新する必要があるため、秘密鍵を変更できなくなります(ビジネスにはあまり適していません...)
これに関する他の既知の問題はありますか?それを行うためのより良い方法はありますか?できれば同じ単純さで。
ここでの複数の問題:
まず最初に:すべてのクライアントインスタンスに含まれているため、「ハードコードされた文字列」を秘密にすることはできません。 リバースエンジニアリング の簡単な餌食です。 =。攻撃者はすでにそれを持っています。有名な例は、PowerDVDなどの「承認済み」ソフトウェアプレーヤーに埋め込まれているDVDコンテンツの暗号化キーです...
したがって、探しているのはper clientsecret string-である必要があります。これは、パスワード、またはクライアントのCookieに格納されている値です。
次に簡単な答え:SSLを使用します(つまり [〜#〜] https [〜#〜] )。リクエスト内に、クライアントごとのシークレット文字列を埋め込みます(これはCookieで自動的に発生します)。残りはSSLが処理します。特に、SSLは、要求だけでなくデータ自体も盗聴者の詮索好きな目から保護します。シチューに含めるハッシュ関数とタイムスタンプの数に関係なく、自家製のスキームからはセキュリティの点で同等のものは得られません。
私は stackoverflowに関する興味深い記事 を見つけました。これはこれを行うさまざまな方法を説明しています。