2016-07-27 4 views
0

私はバックエンドレールアプリに接続するアンドロイドアプリを持っています。私は、デバイスとサーバーの間で送信しているデータを暗号化します。私は秘密鍵で基本的な暗号化を使用しています。キーは本当に秘密ではありません。なぜなら、私はそれをapkに保存しています。逆のエンジニアリングとapkの逆コンパイル技術を使って簡単に扱うことができます。これは "まともな"暗号化アプローチですか?

私が思いついたのは、ユーザーのパスワードに基づいて秘密鍵を生成することです。キーは固定長でなければならず、ユーザーがスーパーロングパスワードをどのように使って強制的にオプションにするのかを見て、私がやっているのは文字を追加することです(基本的には古いハードコーディングされたキーで使用していたものです)文字列(パスワード+文字)は必要な長さです。次に、ユーザ名(技術的には暗号化すべきではないので大したことではない)以外のすべてのパラメータを暗号化しています(私はJSONをサーバとクライアントの通信に使用しています)。 JSONリクエストがサーバーに到達すると、usernameパラメータを使用してデータベースからユーザーのパスワードを取得し(サーバーベース)、キーを作成します。受信したデータを「暗号化解除/暗号化」する必要があります。送信。この方法では、キーは常にServer/Client間で同じですが、すべてのユーザーに固有のものであり、簡単に入手できる、ハードコードされたキーをAPKに保存する必要はありません。また、パスワードはデバイスに保存されていないため、ユーザーはサーバーにログインするたびにパスワードを入力する必要があります。

私が知りたいことは、このアプローチが「適切に保護されている」と考えられるかどうかです。

+0

ユーザー名は一意ですか?そうでない場合は、ユーザー名を使用してパスワードを取得すると、同じ使用名のインスタンスが複数ある場合に問題が発生します。また、ユーザーがパスワードを変更するとどうなりますか?すべてのデータを暗号化し直しますか? – Tim

+0

ええ、ユーザー名はユニークです。 –

+3

なぜhttpsを使用しないのですか? – nasch

答えて

1

https://en.m.wikipedia.org/wiki/RSA_(cryptosystem)公開鍵(アプリに格納されている)を使用してデータを暗号化した後、サーバーは秘密鍵(サーバーに格納)を使用してデータを復号化します。 RSAを使用すると、パブリックキーを使用してパケットを暗号解除することはできず、暗号化するだけです。だから安全です。クライアントごとに鍵ペア(または鍵セット)を作成する必要があります。

+0

これは、MITMの攻撃を防ぎますが、攻撃者は公開鍵を取得してリクエストを送信し、攻撃者からのものではないことをサーバーが知ることができます。それが問題なのかどうかは、OPまでです。 – nasch

+0

真正性が問題の場合、要求は秘密鍵で署名する必要があります。 –

+0

公開鍵暗号を使用して、認証用のユーザ名/パスワードなどの秘密情報を渡すために使用できる対称鍵暗号化セッションを確立します。 –

1

あなたのセキュリティの観点でのあなたのアプローチは見た目がいいようですが、ユーザー体験の観点では、品質は低いかもしれません。また、ユーザーのパスワードから固定長の文字列を生成する場合は、ハッシュ関数を使用できます。

もう1つの方法は、実行時に暗号化キーを取得し、Android Keystoreに格納する方法です。 Androidキーストアへのアクセスは、攻撃者がキーにアクセスすることははるかに困難です。また、この方法では、ユーザーがアプリを使用するたびにパスワードを入力する必要はありません。ただし、対称キーを初めて交換するときは、この方法はMitM attackになります。この問題に対処するには、最初に非対称暗号方式を使用して対称鍵を安全に交換し、次にキーストアに格納されている鍵を常に使用する必要があります。

非対称の方法は通常プロセッサを大量に消費するため、ネットワークトラフィックの暗号化/復号化には非対称のcyptoを使用しないでください。

私の意見では、最良のアプローチはTLSソリューションを使用しています。事前共有鍵(すなわち対称鍵)に同意するTLSでは、RSAアルゴリズムが使用され、その後、すべてのトラフィックが対称アルゴリズムを使用して暗号化/復号化されます。あなたが望んでいた場合

0

あなたは常にパスワードベースのキー派生アルゴリズムを使用することができます。 https://en.wikipedia.org/wiki/PBKDF2

を考える事は、しかし、あなたのキーローテーションのスケジュールが自動的にパスワードのローテーションスケジュールと同じになりますかどうかです。

0

「パスワード」に基づいて同じ対称キーを使用するだけで、クライアントとサーバーが必要ですか?なぜ各端のパスワードからキーを導出しないのですか?

クライアントはパスワードの入力を求められ、適切なランダムソルト(接続ごとに一意)を作成し、反復回数が多い場合は安全なキーを生成します。

クライアントは、ソートと繰り返し回数をサーバーに送信します。サーバーはパスワードのコピーを検索し(ハッシュではなくパスワードを保存しているものとします)、saltとiterationsを使用して一致する対称キーを生成します。

接続ごとに一意の塩を使用すると、試行するために事前に導出されたキーのセットを準備することが難しく、繰り返し回数が多いと、サーバーに対する辞書攻撃を実行するのに時間がかかります(つまり、 )。

関連する問題