web-dev-qa-db-ja.com

iOS上のSQLite DBのAESキーの導出と保存

IOSでローカルSQLiteデータベースの暗号化を管理する方法に関するさまざまなQ&Aを読みましたが、私が見たことから、暗号化キーをコードに格納することは悪いことだという意見はだれもが同意しています。それで、私はそれをしないことにしました。

さて、私が気に入ったもう1つのより安全なオプションは、TLSを介してサーバーから暗号化キーを送信し、証明書のピン留めを使用して、人々がMITMを実行できないようにすることです。残念ながら、私が作成しているアプリはインターネットに接続せずに完全に機能する必要があるため、これは私の状況に問題を引き起こします。

私が見たことのない3番目のオプションは、あいまいさを介したより複雑なセキュリティ方法です(つまり、アプリでプレーンテキストでパスワードを隠すよりもあいまいです)。ここに私が楽しんでいるいくつかのオプションがあります(しかし、すべてが私には幾分疑問を感じます):

  1. 不明だが推測不可能な値(特定のAPIリクエストが完了するまでの経過時間、ユーザーが画面をタップした座標など)を使用してキーを導出します。
  2. データが最初にダウンロードされるときに、アプリのユーザーに明確なパスフレーズを入力してもらい、そこからキーを取得します。

ベストプラクティスは、派生キーの削除(PBKDF2の使用を計画していた)と、salt +ラウンド数の維持を指示することを知っています。 ただし、ユーザーにパスワードフレーズを2回以上要求したくありません(簡単に言えば、デバイスを「認証」した後にのみパスワードフレーズを提供します。 )。

その結果、私はキーをローカルにプレーンテキスト(またはキーチェーン)に保存する必要があると思いますが、実際にはどうしますか?[〜#〜] or [〜#〜] =パス​​ワードフレーズ(上記の1または2)、salt、およびroundsを保存します。次に、アプリはパスワードフレーズを操作してから、それをキー導出関数に渡します。派生キーを保存するとすべてのセキュリティが完全に取り消されるため、これははるかに望ましいようです。

だから、私が知りたいこと。これは馬鹿ですか?誰かが午後にこれをリバースエンジニアリングすることができると決定したでしょうか?それとも、キー導出関数に渡す前に、アプリがキーをどのように操作しているかを理解するのは難しいでしょうか?

5
Dan Loewenherz

キーホルダーに入れてください。これはまさにそのためのものです。これは、アプリで使用されていないときにキーを暗号化し、アプリへのアクセスのみを制限することです。

アプリケーションに、最初の使用時に新しいランダムキーを安全に生成させ、その後のアプリケーションの起動時に再利用するためにキーチェーンに保存するだけです。このように、これらの目的のために設計されたシステムを使用すると、すべてのデバイスに固有の高エントロピーキーがあり、パスワードベースシステムの固有の弱点や独自のキーのロールの落とし穴に制限されませんストレージメカニズム。

3
Xander