データ ファイルを暗号化し、パスワードで保護できる小さなデスクトップ アプリを作成しています (つまり、解読するには正しいパスワードを入力する必要があります)。暗号化されたデータ ファイルを自己完結型で移植可能にしたいので、認証をファイルに埋め込む必要があります (またはそう思います)。
私が知っていることに基づいて、実行可能で論理的に見える戦略があります (これはおそらく危険であるには十分です) が、それが実際に優れた設計であるかどうかはわかりません。だから教えてください:これはクレイジーですか?それを行うためのより良い/最良の方法はありますか?
- ステップ 1: ユーザーは、「MyDifficultPassword」などの平文のパスワードを入力します。
- ステップ 2: アプリはユーザー パスワードをハッシュし、その値を対称キーとして使用してデータ ファイルを暗号化/復号化します。例: "MyDifficultPassword" --> "HashedUserPwdAndKey"。
- ステップ 3: アプリはステップ 2 のハッシュ値をハッシュし、新しい値をデータ ファイル ヘッダー (つまり、データ ファイルの暗号化されていない部分) に保存し、その値を使用してユーザーのパスワードを検証します。例: "HashedUserPwdAndKey" --> "HashedValueForAuthentication"
基本的に、Web サイトのパスワードを実装する一般的な方法 (つまり、OpenID を使用していない場合) から推測しています。これは、ユーザーのパスワードの (ソルト化された) ハッシュを DB に保存し、実際のパスワードを決して保存しないことです。 . しかし、対称暗号化キーにハッシュ化されたユーザー パスワードを使用しているため、認証に同じ値を使用することはできません。したがって、もう一度ハッシュして、基本的に別のパスワードと同じように扱い、二重にハッシュされた値をデータ ファイルに保存します。そうすれば、ファイルを別の PC に持っていき、パスワードを入力するだけで復号化できます。
では、この設計は合理的に安全なのか、それともどうしようもなくナイーブなのか、あるいはその中間なのか? ありがとう!
編集: 明確化とフォローアップの質問: ソルト。
ソルトは有用であるためには秘密にしておく必要があると思いましたが、あなたの回答とリンクはそうではないことを示唆しています. たとえば、 erickson によってリンクされたこの仕様(以下) は次のように述べています。
したがって、ここで定義されているパスワードベースの鍵導出は、パスワード、ソルト、および反復回数の関数であり、後者の 2 つの量を秘密にしておく必要はありません。
これは、ハッシュ化されたキーと同じ場所/ファイルにソルト値を保存でき、ハッシュ時にソルトをまったく使用しない場合よりも安全であることを意味しますか? それはどのように機能しますか?
もう少しコンテキスト: 暗号化されたファイルは、他のユーザーと共有したり復号化したりすることを意図したものではなく、実際にはシングル ユーザー データです。しかし、完全に制御していないコンピューター (職場など) の共有環境に展開し、ファイルをコピーするだけでデータを移行/移動できるようにしたい (自宅や別の場所で使用できるようにするため)ワークステーションなど)。