私が参加している開発者チームは、サーバーとモバイルデバイスの間で機密データを交換する安全な方法を開発しようとしています。
次のアルゴリズムを考え出しました。
デバイスは秘密RSAキーを生成し、公開キーをサーバーに送信します。
サーバーはユーザー固有のAESキーを生成し、RSA公開キーを使用してそれを暗号化してデバイスに送り返します。
デバイスはAESキーを取得します。これを使用してパスワードとユーザー名を暗号化し、サーバーに送信します。
サーバーはユーザー名とパスワードを復号化します。一致する場合、AESキーは、X時間またはログアウトまでの安全な通信に使用されます。そうでない場合は、プロセスを再起動する必要があります。
安全ですか?それを改善できる方法はありますか?欠点は何ですか?
編集:コメントを読んだ後、より安全な代替案は何ですか?なぜですか?
Edit2: OK、わかりました。私は自分の実装を使用しません、すでに試みられて証明されたものを見つけます。
プロトコルのすべての弱点は、「SSLを使用する」または「SSLを使用する!」と要約することができます。
詳細:
全体的な評価として:しないでください。
いいえ、このプロトコルは安全ではありません。
コメントですでに述べたように:
独自の暗号をロールバックしないでください。間違っている可能性があります。特に、自分が何をしているのか本当にわからないと認めた場合。
まず、すでに標準プロトコルがあり、Niceプロパティとセキュリティ証明がある標準的な問題があるようです。データ転送のプロトコルは TLS v1.2 (またはそれ以降)である必要があります。ライブラリを使用する必要があります( [〜#〜] nss [〜#〜] 、 GnuTLS または OpenSSL など)。パスワード認証の場合、最適な選択肢は [〜#〜] srp [〜#〜] または TLS-SRP を使用することです。ただし、SRP(これが最初の選択肢であるはずです)を買う余裕がない場合でも、 この論文 に従うことができます。
これまでのところ改善。
次に、プロトコルの欠陥について説明します。
デバイスは秘密RSAキーを生成し、公開キーをサーバーに送信します。
サーバーはユーザー固有のAESキーを生成し、RSA公開キーを使用してそれを暗号化してデバイスに送り返します。
デバイスはAESキーを取得します。これを使用してパスワードとユーザー名を暗号化し、サーバーに送信します。
認証はありません。鍵交換は暗号化されていますが、認証されていません。これは悪いです。
アクティブな中間者がいる場合、これを検出する方法はありません。このアクティブなMitMは、クライアントがサーバーであるかのように見せかけることができます。そして、サーバーになりすまして、彼がクライアントであると言います。
->しないでください。 @SEJPMは彼のコメントで正しいです。確立された暗号化システムを使用します。証明書付きTLSまたはSRP付きTLSと同様です。