1

あるアプリから別のアプリへの API 呼び出しを行っています。md5ed共有シークレット+タイムスタンプを渡すことで承認を処理します...

$token = md5( $secret . time() );

次に、API エンドポイントで、次のようにリクエストの信頼性を確認します...

if ( md5($shared_secret . time() ) == $token )
    ...do stuff

これは機能します。しかし、それは私が望むほど信頼できるものではありません。その理由は、ネットワーク (または低速の localhost サーバー) の遅延が原因で、タイムスタンプが 1 秒ほどずれているためだと思われます。

タイムスタンプの最後の桁を削除するという怠惰な方法でこれを回避しました。これにより、slowpoke サーバーが呼び出しを行うための最大 10 秒のウィンドウが作成されました。しかし、私はこれに満足していません.9秒の終わりに電話がかかってきたら、同じ問題が再び発生するからです. ######50)。

これを行うためのより良い方法があるはずです。それは何ですか?

4

3 に答える 3

3

token = time || MAC(time, shared_secret)where || の使用を検討してください。は連結であり、MAC は HMAC などのメッセージ認証アルゴリズムであり、秘密鍵といくつかのデータを取得して認証タグを生成します。サーバー側で、MAC が有効であり、時間 (プレーンテキストで受信) が許容範囲内であることを確認します。

これは現在のソリューションよりも安全であり (md5 は貧弱な MAC になります)、ウィンドウの問題も解決します。

このスキームは、許容するエラー ウィンドウ内でリプレイ攻撃を受けやすいことに注意してください (たとえば、同じトークンが 1 秒間に 10 回送信される可能性があり、サーバーにはそれがわかりません)。

于 2013-05-15T18:52:09.343 に答える
0

代わりにノンスを使用しますか? nonce を DB または永続ストレージに保存して、同じものが使用されないようにします。

「9秒の問題」とは逆に、末尾の0から9を切り取ると、###...0から###...9までのハッシュが同じ値になるという同様の問題があります。その10秒の時間枠。

真正性を保証/確認するには、それがより問題になるようです。

サーバーがチェックするために、プレーンテキストとハッシュ化されたテキストを一緒に送信する必要がありますが、タイムスタンプ方式よりも少し優れているようです。

いずれにせよ、これら 2 つのパラメーターだけでは、何かを認証するのではなく、重複した要求ではないことを確認するだけです。

于 2013-05-14T19:42:46.567 に答える
0

時刻はシステム間で信頼できないため、タイムスタンプの使用は正しい方法ではありません。おそらく、代わりにメッセージの長さ/ハッシュをパラメーターとして使用できます。残念ながら、攻撃者による再生を防ぐことはできません。

私が間違っている場合は訂正してください。ただし、承認ではなく、認証 (つまり、送信者が言うとおりの送信者) を扱っているようです。SSL/TLS を使用して送信を保護し、送信がプロキシされているかどうかを確認することをお勧めします。

于 2013-05-15T08:45:44.677 に答える