web-dev-qa-db-ja.com

SMS for a REST APIを使用して、認証トークンを送信する方法

REST APIを暗号化されたSMSで呼び出したい(いくつかの中間サーバーと、SSL経由で送信されるクライアントとサーバーによる共有キーを使用)、認証が必要なリクエストの送信に問題がある場合、ユーザーはインターネット接続があり、JWTトークンが送信され、すべてが正常ですが、SMSで同じメソッドを呼び出したい場合、JWTトークンを送信するとリクエストが非常に長くなり、受け入れられません。

JWTトークンではなく、トークン内の情報をtokenという名前のテーブルに保存し、そのテーブルの暗号化されたidのみをモバイルクライアントに送信します。IDはトークンよりもはるかに小さいため、私の要件を満たします。

このアプローチの欠点は何ですか?つまり、署名されたトークンを送信する代わりに、暗号化されたidをクライアントに送信します。トークンに関するすべての情報(userId、timeStamp、clientIP、ユーザーの携帯電話番号)は、サインインしたユーザーの外部キーを持つTokensという名前のテーブルに格納されます。

リプレイ攻撃、盗まれたトークンはクライアントIPまたは携帯電話番号によって処理されると思いますが、他にどう思いますか?

追加したいもう1つのポイントは、私のサーバーはWebクライアントとモバイルアプリでのみ使用され、それ以上は使用されないことです。

1
Rathma

トークンをデータベースに格納し、その(暗号化された)IDをクライアントに送信することで、新しいトークンを作成しました。 JWTトークンを忘れて、新しいトークンはデータベース内の暗号化された整数IDです。

新しいトークンとしてIDを使用しないでください。IDは通常インクリメントされます(したがって予測可能です)。一部の暗号化スキームでは、暗号文のビットを反転するとプレーンテキストでの復号化後にそれが反転するため、攻撃者はIDを読み取れずにIDをインクリメントできます平文。暗号化手順全体をスキップして、(暗号的に安全な)乱数を使用することができます。さらに良い方法-SMSでの送信に有効なランダム文字の許容可能な最長の文字列を使用します。

暗号化は平文と暗号文の全単射であるため、乱数を暗号化しても推測は難しくなりません。また、暗号化では、プロトコルにMACを追加しない限り、復号化前に暗号文が変更されていないことを確認できませんが、MACが長すぎる場合は、.

また、送信者を特定するために送信者の電話番号に依存するべきではありません(またはSMSの機密性に依存しないでください)。SS7は盗聴およびなりすまし攻撃に対して非常に脆弱です。しかし、誰もが何らかの理由で安全であるかのように行動します...

3
Andrew Morozko