私たちは新しいプロジェクトに取り組んでいます。私たちは2人のリード開発者であり、トークンを使用してサーバーとクライアント間の通信を保護する方法についての岐路に立っています。
ユーザー名とパスワード、およびcurrent_time(この変数はサーバーのデータベースとクライアント側にも保存されます)をAPIに送信することにより、クライアントはプライマリトークンを要求し、サーバーは入力を解釈してハッシュトークンをレンダリングします(例: 58f52c075aca5d3e07869598c4d66648)はデータベースに保存し、クライアントに返します。
これで、クライアントはプライマリトークンを保存し、プライマリトークン+認証要求で送信されたcurrent_time変数を使用して新しいハッシュトークンを作成します(この新しいトークンmain_tokenを呼び出します)。サーバーも同じことを行い、同じアルゴリズムを使用して同じトークンを作成します。 。
クライアントがサーバーAPIにクエリを送信するたびに、サーバーはmain_tokenをサーバーに送信し、サーバーはその中で生成されたトークンをクライアントが送信したmain_tokenと比較します。一致する場合、ユーザーは本物であることを意味します
クライアントは2つのランダムキーを生成します($ key1 = Rand(10000,90000); $ key2 = Rand(10000,90000);)APIでの各リクエストで、クライアントはクエリタイプを使用してハッシュを作成し、2つのキーを使用して複雑なアルゴリズム。これら2つのキーとハッシュをサーバーに送信します
サーバーは、クライアントで使用されているのと同じアルゴリズムを使用して、ハッシュを作成し、クライアントから送信されたものと比較します。一致する場合、サーバーはクエリの処理に進みます
さて、問題は、APIリクエストを保護するために使用する最も論理的で安全な方法はどれかということです。
私は一般的に最初のアプローチが本当に好きです。
最初に覚えておくべきことの1つについて、覚えておくべきことは1つあります。トークンのハッシュに使用するタイムスタンプには、TTL有効期限が非常に短い(1秒など))必要があるため、メッセージが12時間前に同じタイムスタンプとトークンで送信されていないことを確認します。明らかに、正当なものとして計算されますが、この場合はそうではありません。
これらがあなたが検討している唯一の2つのオプションである場合、私は他にも多くの方法があるので、他のアプローチも検討したことを確認したいと思います。実際にリストアップする以上のものです。これらはいくつかの一般的なauthアプローチであり、目的に適しているかどうかを確認するためだけに検討する価値があります。他に何も理解していない場合は、どのアプローチを強化するためのアイデアも得られます。
注意してください、私はセキュリティの専門家ではありませんではありません。
このアプローチでは、サードパーティの保証人がいて、使用するコードがトークン/証明書/何を持っているかをリクエストし、それをあなたに渡します。この時点で行う必要があるのは、与えられたキーが合法。
プロ:
短所:
ここでは、クライアントがユーザーを作成したときに共有した公開証明書を使用して、クライアントに通信を暗号化させます。あなたの側では、そのユーザーに関連付けられた秘密鍵を使用して復号化します。一般に、チャレンジレスポンスを使用して通信を開始し、暗号化/復号化できることを示します。チャレンジ/レスポンスを使用しない「同期」アプローチも可能ですが、セキュリティが少し低く、時間同期の問題があり、トリッキーになる可能性があります。
から Novell (ええ、私は知っています、小説?本当に?)
トークンは、ワンタイムパスワードを生成するための基礎として変数を使用します。この変数はチャレンジと呼ばれます。パスワードの生成に使用される変数を決定するための2つの主な方法は、非同期または同期です。
非同期またはチャレンジ/レスポンス方式では、サーバーソフトウェアはトークンデバイスに暗号化するための外部チャレンジ(ランダムに生成された変数)をトークンに送信します。トークンは、このチャレンジ変数、暗号化アルゴリズム、および共有シークレットを使用して、応答、つまり正しく暗号化されたパスワードを生成します。
同期方式では、パスワードの生成に使用されるチャレンジ変数は、トークンとサーバーによって内部的に決定されます。各デバイス内の時間カウンター、イベントカウンター、または時間とイベントカウンターの組み合わせが、チャレンジ変数の基礎として使用されます。トークンとサーバーはそれぞれ個別に内部的にチャレンジ変数を独自のカウンターから決定するため、タイムカウンターとイベントカウンターの同期を維持することは非常に重要です。サーバーとトークンが同期しなくなるのは非常に簡単であるため、ほとんどの実装では、カウンター間で一定量のドリフトを許容しています。通常、これらのカウンター値の小さな範囲またはウィンドウがパスワードの計算に使用されます。ただし、トークンとサーバーがこのウィンドウを超えて同期しなくなった場合は、それらを同期するための特別な手順が必要です。
プロ:
短所:
これが小規模なサービスまたは内部のみのサービスであり、Windows環境を使用している場合は、標準のNTLM認証を使用してアクセスを保証しても問題はありません。特にIISを使用している場合、これは最も簡単なアプローチです。web.configでの保守と設定も簡単です。
プロ:
短所:
認証アプローチでナンスを使用する場合、サービスでナンスを取得するメソッドを提供します。このメソッドは、リクエストごとに一意の任意の文字列またはデータ(「ノンス」)を返します。他のメソッドへのすべてのリクエストでは、ナンスを取得して、リクエストの暗号アルゴリズムで使用する必要があります。ここでの価値は、サーバーが使用されたナンスを追跡し、ナンスの再利用を決して許可しないことです。これにより、1つのナンスを含む要求が作成されると、そのナンスを含む要求を再び行うことができないため、リプレイ攻撃を完全に防ぎます。ナンスが要求されると、それらは使用可能なナンスのリストに追加され、使用されると、使用可能なリストから使用済みリストに移動されます。ナンスを生成するときは、生成したものが使用済みリストに含まれていないことを確認してください。使用可能なリストには古いリストが1つもないため、繰り返しはできません。
プロ:
短所: