「Remember Me」の時間制限付き自動ログインタイプ機能をモバイルアプリケーション(Android)に実装したいと思います。アプリを起動するには、ユーザー名とパスワードを入力する必要があります。便宜上、
[〜#〜]編集[〜#〜]
最後に入力したユーザー名またはパスワード、あるいはその両方を電話のファイルに保存して、ユーザーが毎回入力し直さないようにします。
this を見ましたが、ブラウザ指向のようです。
質問:
編集2
代理キーやssl/tslを使用した公開キー認証を使用して、これらを複雑にしすぎていませんか?つまり、Firefoxは私のパスワードを保存し、確かにそれらは何らかの方法で暗号化されていますか?同様の方法でユーザー/パスを暗号化することを考えていましたか?それは悪い考えですか?
ユーザー名とパスワードとは別にアカウントに関連するログイン時にランダムにマッピングされた値を作成するというsymcbeanの提案が好きです。ただし、具体的に質問に答えるために、静的にマップされたキーなしでデータを暗号化する方法もあります。私は、電話に固有でOS API呼び出しを介して取得できる情報のビットを使用してキーを生成することを検討します。
編集:@DWの要請により、詳しく説明します:UDID、シリアル番号、およびその他の識別情報は、保存された暗号化の解読を防ぐために電話にアクセスすることなく、十分な暗号品質と機密性を備えている場合がありますデータ。ただし、保存されたデータへのアクセスには、電話へのアクセスも含まれる可能性があります。したがって、デバイスローカルの暗号化によるセキュリティのレベルは、単純なものです。
他の回答者は、HTTPセッションで行われるようにランダムな値を保存することを提案しています。元の質問者はHTTPを使用していないようで、この方法が彼のソフトウェアに適用されるとは考えていません。ただし、ランダムな値の保存と送信の論理的な実装は、どのトランスポートプロトコルにも適用できます。強くお勧めします。
または、公開鍵暗号化を使用して、クレデンシャルを電話機に保存できます。アプリケーションは、サーバーの公開鍵を使用して、エントリ時にユーザー名とパスワードを暗号化できます。したがって、デバイスが危険にさらされていても、ログインデータは読み取れません。
ログイン認証情報の取得を防ぐことが目的の場合、ランダムな一時識別子を使用するのが最善だと思います。これにより、サーバーデータ(秘密キー)を秘密にして利用できるようにするという問題が排除されます。そのキーが開示された場合、保護は役に立たない程度になります。紛失した場合は、新しいキーを使用してアプリを再デプロイする必要があります。一時的なログインデータが失われた場合、誰もがログインを余儀なくされますが、サービスが著しく中断されることはありません。
また、最初のログインと、ユーザー名とパスワードまたはランダムな値であるかどうかに関係なく、その他の可能な認証データの両方に、トランスポートの公開鍵暗号化(SSLまたはアプリに埋め込まれたシンプルなPGPキー)を使用してください。
ユーザー名とパスワードを電話に保存しないでください。
代わりに、次の2つの戦略のいずれかに従うことをお勧めします。
永続的なCookieを使用します。これは簡単な解決策です。 Webサイトに接続している場合は、初めてログオンするときにサーバーでユーザーを認証し、ユーザーのアカウントに関連付けられている(暗号化された)ランダム128ビット文字列を含む永続的なCookieをユーザーの電話に設定します。その後ユーザーがアプリケーションを起動するたびに、アプリケーションがHTTP/HTTPSを介してサーバーに接続すると、クライアントは永続的なCookieを送信し、サーバーはこれを使用してクライアントを認証できます。理想的には、HTTPSを使用し、安全なCookieを使用します。
公開鍵認証を使用します。これはよりトリッキーなソリューションです。電話アプリケーションに独自の公開/秘密鍵ペアを生成させることができます。ユーザーが初めてログオンすると、アプリケーションは公開鍵を送信でき、サーバーは公開鍵をそのアカウントに関連付けることができます。その後ユーザーがアプリケーションを起動するたびに、アプリケーションは秘密鍵を使用してサーバーに対して自身を認証できます。
たとえば、Webテクノロジーを使用している場合、クライアントに自己署名証明書を生成させ、HTTPSを使用してサーバーに接続し、クライアント証明書を使用して自身を認証させることができます。 AndroidのWebビューがクライアント証明書を適切にサポートしているかどうかをテストする必要があります。
または、独自のカスタムプロトコルを使用してサーバーに接続する場合は、SSLまたはTLSでトンネリングし、SSL/TLSのクライアント証明書機能を使用します。
トークンにユーザー名/パスワードを使用しないでください!
復号化が可能な場合は、復号化される恐れがあります。そして、ほとんどの人々は知らないはずのことを知っていますが、複数のサービスに同じパスワードを使用しています。そのため、サービスに特に価値がない場合でも、与えられたパスワードを保護する責任があります。
問題を解決する方法は、HTTPセッションの管理と同じです-サロゲート識別子(セッションCookieと同じ値を保持する可能性がありますが、寿命が長い)を使用し、サロゲート識別子のルックアップテーブルを維持します。に発行され、有効期限。
D.W.の2番目のオプションは、次の修正と追加の詳細を使用して最適に実装されます。
上記を介して、コードの逆コンパイルとリバースエンジニアリング+デバイスに保存されたデータへのアクセス(デバイスへの物理アクセスORルート化されたデバイス上の悪意のあるアプリ)+デバイスの知識(フィンガープリント)いくつかのトリックを介してORデバイスへの物理アクセスORデバイス上のアプリの制御)は、そのキーペアとAppDeviceIdを使用して認証することができます。