web-dev-qa-db-ja.com

Androidアプリで6桁を使用してデータを保護するPIN

Androidアプリでは、ユーザーは起動時に6桁を入力する必要がありますPINです。このアプリケーションには機密データが含まれているとしましょう暗号化したいこと。

これを行う方法は次のとおりです。

  • 鍵導出関数(PBKDF2など)を使用して、PINから鍵を生成します。
  • キー(およびCBC + paddingなどの適切な構成)を使用して、AESで機密データを暗号化します。
  • 暗号化されたデータをどこにでも保管できます。共有設定。

私がここで見る主な問題:元のPIN 6桁のスペースPINは10 ^ 6です(かなり小さい)) =暗号化の基礎として使用する...

実際にこれを微調整して、保存されたデータをしばらくの間安全にすることができますか?

単純な派生に1秒かかるようにKDFを調整しても(ユーザーがアプリの起動中にはるかに長く待機することは期待できないと思います)、1,000万回の処理にはわずか11.5日かかります(仮定すると電話と同じ処理能力ですが、そうではありません...)。

制限:
明らかにより長い/より強いPINを使用すると効果的ですが、残念ながら6桁のPINはユーザーによってハードルと見なされます。おそらくオプションではありません。またKDFの強さは、ユーザーがアプリの起動中に待つことができる時間の長さによって制限されます。これは、およそ1秒です。 。

私の推奨するオプションは、データを保存するか、少なくともキーサーバー側に保存することです。

これは可能ではないので、矛盾する要件があることを経営陣に戻します。暗号化が実際の値を提供するにはキースペースが小さすぎると私は主張します。私は管理者に毎秒156推測の現実世界の見積もりを与えることをお勧めします(この記事から https://arstechnica.com/security/2015/08/cracking-all-hacked-ashley-madison-passwords-could- take-a-lifetime / )。つまり、クラッカーは2時間以内にすべての可能な結果を​​得ることができます。カスタムビルドのクラッキングハードウェアは、モバイルデバイスよりもはるかに高速です。例については、こちらをご覧ください https://sagitta.pw/hardware/gpu-compute-nodes/brutalis/

このような小さなキースペースのオフライン要件では、データを適切に保護することができなくなることを経営者に知らせます。データを安全にしたい場合は、6桁のピンを使用するか、オフライン要件を使用する必要があります。

1
Dan Landberg

PINコードはセキュリティトークンと見なすべきではありません。これは単なるUIであるため、入力に失敗した回数を制限したり、そのような試行の間に増分待機を導入したりできます。

データ自体は強力なキーで暗号化できます(暗号化する必要があります)。これにより、ローカルデータがオフラインクラッキング(ディスクを直接読み取ろうとする悪意のあるエージェント)から保護されます。 Android 7.0以上では、 Direct Boot を信頼できます。アプリは Storage Encryption Status を確認し、それに応じて動作できます。

これは、ルート化されたデバイスにアプリをインストールし、データを復号化したい悪意のあるユーザーからの完全な保護を提供しません。デバイスがルート化されているかどうかを確認することをお勧めしますが、特定のエージェント(ユーザーまたはマルウェア)が検査で検出されないルートを有効にできることを知っておく必要があります。

1
Alex Cohn