私のアプリは、デバイス上の暗号化されたユーザーファイルで動作する必要があります。誰かがデバイスを手にしたとき、それはデータを秘密に保つべきです。このため、私は次のスキーマについて考えています(これは間違っている可能性があるため、私が尋ねているのはそのためです)。
k
(事前定義された固定長)を生成します。これは、ファイル暗号化のマスターキーとして使用されます。K = k || o
_を定義し、o
はゼロのストリング(事前定義された固定長)です。h("")
を計算します。つまり、キー導出関数を空の文字列に適用します(これは初期パスワードです。ユーザーがデータを保存する前にパスワードを変更するように求められるので問題ありません)。K ^ h("")
をキーファイルに保存します(長さが一致していると仮定します)。パスワードを検証するために、キーファイルの内容はh(password) ^ h("")
でxorされます。結果は_k || o
_でなければなりません。つまり、(少なくとも)o
の長さと同じ数のゼロで終わる必要があります。
パスワードを変更するために、古いパスワードが検証され、チェックに合格すると、キーファイルの内容がh(oldPassword) ^ h(newPassword)
でxorされ、結果によってキーファイルが上書きされます。
Xoringで十分かと思います。スキーマ全体が混乱している可能性は十分にありますが、適切なものを見つけることができませんでした。
私はあなたの設定は実際には大丈夫だと思います、提供されます:
しかし、私はあなたがここのエッジに正解であることに注意します。これは正しく理解するのが難しいものであり、弱点を簡単に持ち込む可能性があります。また、これは暗号の愛好家による迅速な分析であり、専門家ではありません。
マスターキーは Key Wrap -NISTの推奨事項に従って保護する必要があります 800-38F (2012年に最終化)が最善のアプローチです。
マスターキーはそれほど長くないため(128/256ビット)、最終的な暗号化されたマスターキーの暗号文によって公開される情報を最小限に抑えることが重要です。
NISTキーラップスキームは、XOR関数を巧みに使用してこれらの要素を直接暗号文に組み込みます。そのため、提供する必要があるのは強力な暗号化キーだけです。