web-dev-qa-db-ja.com

SQLiteにパスワードを保存するか、ユーザーに毎回入力するように要求する

私はAndroidアプリを非常に安全にする必要があります。サーバーへの認証には、次のような2要素認証を使用します。

  • ユーザー名/パスワード
  • sms検証

私の場合は実用的ではないので、クライアント証明書(秘密キー付き)を使用できません。

パスワードはサーバーに安全に保存されます(おそらくハッシュとソルト)。しかし、Androidクライアントとして使用されるアプリでパスワードを入力するための最良の方法を理解するのに苦労しています。

私は現在2つのオプションを検討しています:

  • ユーザーがサービスを使用するたびにパスワードを要求する
  • パスワードを電話DBに保存し、ユーザーがサービスを使用するたびにパスワードを再利用します

最初のオプションは、パスワードが電話に保存されることはないため(RAMの一時的なものを除く)、良いですが、デバイスがkeylogger

キーロガーをAndroidデバイスにインストールする方法について読みました。最も一般的な方法は、被害者にすべてのアプリで使用されるカスタムキーボードをインストールさせることです。

これはD.W.ここ: スマートフォンのキーロガー?

2番目のオプションはキーロガーの影響を受けません(ユーザーが初めてパスワードを入力するときを除く)が、一部のマルウェアがデータベースをダンプするリスクがあります。 AndroidでのSQLiteのセキュリティに関する情報はそれほど多くありません。

また、2番目のオプションでは、誰かがデバイスに物理的にアクセスした場合にリスクが高まります。ただし、アプリへのアクセスを保護するために何らかのPINコードを使用することで、このリスクを軽減できます。

また、認証の2番目の要素(私の場合はSMS)も、電話のマルウェアによって、またはプロバイダーでSMS)を傍受することによって危険にさらされる可能性があります。

だから、私の質問は、根ざしていないAndroidデバイスでアプリのデータベースをダンプする既知の方法はありますか?それが起こる可能性は何ですか?

2
user3362334

この質問を解くにはかなりの数があります。私はAndroid開発者ではないことに注意して、質問に答えるために最善を尽くします。

手始めに、従来の形式の2要素認証の本質は、あなたhaveとあなたknowです。デバイスへのパスワードの保存を許可すると、デバイスを単に所有するだけでセキュリティが侵害される可能性があるため、2FAを実装することで得られるセキュリティ上の利点をある程度軽減できます。そうは言っても、私の意見では、デバイスにパスワードを保存する機能を提供すべきではありません。

パスワードはサーバーに安全に保存されます(おそらくハッシュとソルト)

アプリケーションを安全にしたい場合は、絶対ランダムにソルトとハッシュを行います。

注目に値するかもしれません NISTはSMS二要素認証の使用を推奨していません。 なので、おそらくGoogle認証システムのようなものを調べたいと思うでしょう。

ルート権限のない電話でSQLiteデータベースをダンプできるかどうかはわかりませんが、Androidマルウェアの遍在性を考えると、意図しない電話によって電話が危険にさらされる可能性があると想定して動作します悪意のあるアプリのインストール。

3
DKNUCKLES

それは私の意見ですが、丸いホイールがちょうど周りにあるとき、あなたは正方形のホイールを再発明しようとするべきではありません。古いUnixユーザーとして、優れたアプリケーションは、コーヒーを持ち込むことを含むすべてのことをしようとするのではなく、1つのことを実行して最善を尽くすべきだと思います。

アプリケーションがパスワード保管庫ではないと想定すると、パスワード管理機能を提供することも考慮すべきではありません。ユーザーの1人が自分のパスワードを保存したい場合どこかに彼がすべての接続でそれを入力する必要がないように、彼に彼の好きなパスワードマネージャーを使わせてください。方法は、ローカルストレージ、クラウドストレージ、またはストレージなしのいずれを好むかを決定します。キーロガーの処理の問題は、パスワードマネージャーの開発者にあります-質問はすでにあるはずです正しいパスワードマネージャによって対処されます...

私見、アプリで優れたKeypass、1Password、Lastpassなどのよく知られたパスワードマネージャーの使用方法を文書化し、独自の機能に集中してください。

1
Serge Ballesta

より良いオプションは、検討している2つのうちの1つではないものです。 OAuth のようなアクセストークンベースのスキームです。これにはユーザーを覚えておく効果がありますが、アカウント全体を変更せずに特定のトークンを取り消すことができます。これは、たとえばデバイスを紛失した場合に役立ちます。トークンを時々期限切れにすることもできます。これにより、盗まれたトークンが盗まれたパスワードが提供するであろう永続的なアクセスを与えることを防ぎます。

Googleは、Androidでアカウント認証を処理する方法について 一連のチュートリアル を提供しています。おそらくそれを読むか、少なくとも AccountManager について詳しく調べる必要があります。