質問

背景:

REST Webサービスの認証スキームを設計しています。これは<!> quot; really <!> quot;ではありません。安全である必要があります(個人的なプロジェクトです)が、エクササイズ/学習体験として可能な限り安全にしたいです。面倒なことや、ほとんどの場合はセットアップにかかる費用が不要なので、SSLを使用したくありません。

これらのSOの質問は、始めるのに特に役立ちました:

の簡易バージョンを使用することを考えていますAmazon S3の認証 OAuth が好きですが、私のニーズには複雑すぎるようです)。ランダムに生成された nonce をリクエストに追加して、リプレイを防ぎます攻撃。

質問にアクセスするには:

S3とOAuthの両方は、いくつかの選択されたヘッダーと共にリクエストURLに署名することに依存しています。 どちらもPOSTまたはPUTリクエストのリクエスト本文に署名しません。これは、URLとヘッダーを保持し、リクエストの本文を攻撃者が必要とするデータで置き換える中間者攻撃に対して脆弱ではありませんか?

署名する文字列にリクエスト本文のハッシュを含めることで、これを防ぐことができるようです。これは安全ですか?

役に立ちましたか?

解決

以前の回答では、データ転送のコンテキストでSSLのみが言及されていましたが、実際には認証については取り上げていませんでした。

あなたは本当にREST APIクライアントを安全に認証することを求めています。 TLSクライアント認証を使用していない限り、SSL alone はREST APIの実行可能な認証メカニズムではありません。クライアント認証なしのSSLは、サーバーのみを認証します。これは、クライアントを認証する必要があるため、ほとんどのREST APIには関係ありません。

TLSクライアント認証を使用しない場合は、ダイジェストベースの認証スキーム(Amazon Web Serviceのカスタムスキームなど)またはOAuth 1.0aまたはHTTP Basic認証(ただしSSLのみ)を使用する必要があります。

これらのスキームは、リクエストが予想される誰かによって送信されたことを認証します。 TLS(SSL)(クライアント認証なし)は、回線を介して送信されるデータが改ざんされないようにします。それらは別個の問題ですが、補完的な問題です。

関心のある方のために、に関するSOの質問を拡張しました。 HTTP認証スキームとその仕組み

他のヒント

RESTは、Webの標準、および<!> quot; secure <!> quot;の標準を使用することを意味します。 Webでの転送はSSLです。それ以外はファンキーになり、クライアントに追加の展開作業が必要になります。これには、暗号化ライブラリを使用可能にする必要があります。

SSLにコミットすると、原則として認証に必要なものは何もありません。精巧な署名プロトコルよりもはるかに単純であり、安全な接続のコンテキストで依然として有効であるため、Web標準を使用してHTTP基本認証(各リクエストとともに送信されるユーザー名とシークレットトークン)を使用できます。パスワードがプレーンテキストを超えないようにする必要があります。そのため、プレーンテキスト接続でパスワードを受け取った場合は、パスワードを無効にして開発者にメールすることもできます。また、通常のパスワードを記録しないのと同じように、受信時に資格情報がどこにも記録されないようにする必要があります。

HTTPダイジェストは、秘密トークンが渡されるのを防ぐため、より安全なアプローチです。代わりに、サーバーが相手側で検証できるハッシュです。ただし、上記の予防措置を講じている場合は、感度の低いアプリケーションではやり過ぎかもしれません。結局のところ、ユーザーのパスワードは、ログイン時にプレーンテキストで送信されます(ブラウザで派手なJavaScript暗号化を行っていない限り)。同様に、各リクエストでのCookieも同様です。

APIでは、クライアントが開発者がWebサイトにログインするパスワードの代わりに、トークン(ランダムに生成された文字列)を渡す方が良いことに注意してください。そのため、開発者はサイトにログインし、API検証に使用できる新しいトークンを生成できる必要があります。

トークンを使用する主な理由は、危険にさらされた場合にトークンを交換できることです。一方、パスワードが危険にさらされた場合、所有者は開発者のアカウントにログインして、必要な操作を実行できます。トークンのさらなる利点は、同じ開発者に複数のトークンを発行できることです。おそらく、複数のアプリを持っているか、異なるアクセスレベルのトークンが必要なためです。

(接続をSSLのみにすることの影響をカバーするために更新されました。)

または、この問題の既知の解決策を使用してSSLを使用することもできます。自己署名証明書は無料で個人的なプロジェクトですか?

URLのパラメーターの1つとして本文のハッシュが必要であり、そのURLが秘密鍵を介して署名されている場合、中間者攻撃は本文を次のコンテンツでのみ置換できます。同じハッシュを生成します。少なくとも今ではMD5ハッシュ値を使用して簡単に実行でき、SHA-1が破損している場合でも、画像を取得できます。

ボディが改ざんされないようにするには、ボディの署名が必要になります。中間者攻撃は、秘密鍵がわからないために破られる可能性が低くなります。署名を生成します。

実際には、元のS3認証では、MD5署名が弱いにもかかわらず、コンテンツに署名することができます 。 HMAC(署名される文字列)にContent-MD5ヘッダーを含めるというオプションのプラクティスを単に強制できます。

http://s3.amazonaws.com/doc/s3- developer-guide / RESTAuthentication.html

新しいv4認証スキームはより安全です。

http://docs.aws.amazon。 com / general / latest / gr / signature-version-4.html

提案により、クライアントがサーバーと通信することが難しくなることを覚えておいてください。彼らはあなたの革新的なソリューションを理解し、それに応じてデータを暗号化する必要があります。このモデルはパブリックAPIにはあまり適していません(amazon \ yahoo \ google ..でない限り)。

とにかく、本文のコンテンツを暗号化する必要がある場合は、次のような既存の標準とソリューションを確認することをお勧めします。

XML暗号化(W3C標準)

XMLセキュリティ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top