web-dev-qa-db-ja.com

安全なAndroidアプリの機密データ?

はい、これは非常に一般的な質問ですが、機密データをアプリに配信するウェブサーバーを使用して、ベースに触れるアプリを処理する最良の方法を感じようとしています。すべてのリンク、一般的な情報のアドバイスなどをいただければ幸いです。

アプリはデータベースから取得した永続データを一定時間保存するため、すべてがやや扱いにくいものになります。

67
DJPlayer

機密データをデバイスに保存する

それは視聴者に大きく依存します。通常、Android OSは、実績のあるLinuxファイルのアクセス許可を通じて、アプリが互いのファイル(データベース、設定ファイル、アプリのプライベートディレクトリに保存された通常ファイル)にアクセスすることを禁止します。ルートアクセスを取得し、すべてを読み取ることができます。

  1. ユーザーがルートを持たないことがわかっている場合(たとえば、アプリをAndroid Marketで配布しているが、会社内のみ、またはそのようなものである場合)、Androidに頼ることができます)ファイルシステムベースのセキュリティ。
  2. ユーザーがルートアクセスを取得した場合、ユーザーはその権限をどのアプリケーションに付与するかを非常に慎重に判断します。
  3. アプリがルートアクセスを取得すると、大混乱を招く可能性があります。アプリ内の情報は、ユーザーの心配を最小限に抑えることができます。
  4. 発根すると、保証がなくなります。アプリに含める。根ざした携帯電話で情報が漏えいする責任は負いかねます。

結論として、もしあなたの情報が極度に過敏なものでなければ(例えばクレジットカード情報)、Android(つまり、すべてをプレーンテキストで保存し、他のアプリはアクセスできません)。

それ以外の場合、暗号化が道です。 100%安全ではありません(ハッカーがアプリを逆コンパイルし、データを復号化する方法を見つけ出す可能性があります)が、クラックすることは大きな苦痛であり、ほとんどのハッカーを阻止します。特に ProGuard のようなコードでコードを難読化する場合。


サーバーからデバイスへの機密データの転送

ここにはいくつかのオプションがあります。まず、常にHTTPSを使用します。 HTTPSを有効にした後、私が提案する2つの追加のセキュリティ対策を以下に示します。

  1. APIキーシステムを使用します。すべてのリクエストにこのAPIキーを含め、サーバー側で確認してから応答を送信します。 HTTPSを使用しているため、攻撃者はネットワークスニファーを使用してAPIキーを見つけることはできません。ただし、これは誰かがあなたのアプリを逆コンパイルするかどうかを把握するのは非常に簡単です。そのため、さらにプロガードを難読化することができます。たとえば、コード全体でAPIキーを細かく分割できます(たとえば、2つまたは3つのクラスの静的メンバーとして)。次に、リクエストを送信すると、それらのすべてのピースが連結されます。他の種類の変換(ビットシフトなど)を適用して、逆コンパイルされたコードを把握しにくくすることもできます。
  2. リクエストを送信するたびにキーを生成できます。このキーは、あなただけが知っている少しのロジックを使用して生成されるため、クライアント側およびサーバー側にも実装できます。たとえば、リクエストには次のパラメータを含めることができます。
    _time=1321802432&key=[generated-key]_
    _generated-key_は、timeパラメーターから生成されます。例:md5(time + salt)。サーバーはこの要求を受信すると、次の2つのことを実行できます。
    1. keyが実際にmd5(time + salt)と等しいことを確認します(クライアントとサーバーのみがソルトを知っており、上記のAPIキーと同様に難読化できることに注意してください)。
    2. timeが過去にさかのぼっていないことを確認します(たとえば、過去1〜2分以上の場合は、リクエストが無効であると見なします)。

2番目の方法は、送信されているパラメーターを全員が見ることができるプレーンなHTTP要求も実行している場合に便利です。また、逆コンパイルされたコードを理解するのははるかに困難です。特に、キー計算ロジックを複数のクラスに分散している場合。

ただし、nothingはアプリのクラッキングを不可能にすることに注意してください。ハッカーが本当にデータを取得することに決めている場合、アプリケーションを逆コンパイルすることで、ハッカーが難読化できるようになります。多くの眠れない夜をコードを通り抜けて、リクエストがどのように形成されるかを考えます。データを保護する唯一のreal方法は、上記で書いたすべての作業を行う以外に、ユーザーにパスワードを要求することです。逆コンパイルされたコードから誰か(ユーザー)の頭にしか存在しないパスワードを取得することはできません:)。

99
Felix

(Google検索のおかげでここに来ました)

私は最近これを多く研究しており、このページはGoogleとBingの検索のおかげでたくさん出てきました。デバイスにデータを安全に保存するために広く受け入れられている手順は、AESのような強力な暗号化アルゴリズムを使用することです。難しい質問は、「AESには安全なキーが必要です。キーで何をしますか?」です。

Googleは最近、アプリ用のクラウドベースのストレージソリューションを発表しました。状況が許せば、そこにキーを保存することを検討できます。そうでなければ、サーバーのように、デバイスの外部でキーを取得する方が良いようです。ユーザーにPINを入力させることができれば、実際には最適に機能します。パスワードを保存するためにパスワードの導出を行うことができ、パスワードを検証するために導出をやり直すことができます

「ユーザーがPINを入力する」部分がないと、その質問に対する多くの良い答えが見つかりませんでした。ただし、アプリでキーを1つ保存する必要がある場合は、キーをハードコードしないでください。少なくとも、安全なパスワードジェネレーターおよび/またはPBKDF2(パスワードベースの派生関数2)などの派生関数を使用してキーを生成します。

投稿を正しく読んだ場合、Googleは、アプリの初回起動時にキーを生成し、MODE_PRIVATEフラグを介して多くのファイルI/O操作にキーを保存し、それをキーとして使用する方法の1つだと言いました。また、そのマスターキーに基づいて他のキーを派生させることもでき、NISTは実際にその行に沿って何かを提案します。

マスターキー方式を信頼するかどうかにかかわらず、私はあなたにお任せします。このキーは、ルート化されたデバイスで公開されます。また、私はまだ問題を調査していることを認めます

12
Joe Plante

Android上のすべてのアプリケーションは安全なサンドボックス環境で実行されるため、システム上の他のプロセスは適切なハンドシェイクなしではコードまたはプライベートデータにアクセスできません。しかし、多くの脆弱性は、アプリ。このリンクからAndroid開発者サイトは、セキュリティのための良いヒントのいくつかをアドバイスします- https://developer.Android.com/training/articles/security-tips.html

1

HTTPの代わりにHTTPSでSSLを使用してデータを転送するには、Webサーバーで証明書をセットアップする必要があります。

データが本当に心配な場合は、送信する前に一意のアルゴリズムでさらに暗号化し、アプリに到達したときに解読します。本当に強力なものが必要でない限り、TCPに基づいて独自のプロトコルを開発するか、別のポートを使用するか..

http://en.wikipedia.org/wiki/Secure_Sockets_Layer http://developer.Android.com/reference/javax/net/ssl/package-summary.html http:/ /blog.synyx.de/2010/06/Android-and-self-signed-ssl-certificates/

アプリにデータを保存するには、保存する前にデータを暗号化するか、ブラウザを使用してsqliteデータベースを簡単に表示できるため、SQLite以外の別の形式を使用してセキュリティを強化できます。

電話がルート化されていない限り、電話からデータを抽出する方法はありません。

0
Rejinderi

アプリを見る以外にユーザーがデータを見ることができないようにしたい場合は、暗号化が本当に唯一の方法です。デバイスがルート化されている場合、ユーザーは「保護された」ストレージにもアクセスできます。データを表示するには、ある時点でデータを復号化する必要があるため、暗号化さえ完全に安全ではありません。カジュアルなブラウザを非表示にしますが、ハッカーを非表示にしません。

0
Kuffs