web-dev-qa-db-ja.com

長いパスワードの場合、パスワードベースのキー導出はどの程度安全ですか?

デバイス内のファイルを暗号化して保存しています。そのため、デバイスのライフサイクル全体を通して同じキーを維持する必要があります。キーの導出には、OpenSSLの EVP_bytestokey() を使用します。

パスワードベースのキー導出(PBKD)の問題は、パスワードがユーザーからのものである場合、攻撃者がパスワードを推測できることです。しかし、私の場合、パスフレーズとして(ユーザーではなく)長いシステムベースの番号を使用しています。これは正しい方法ですか?

コードの暗号化キーを変更すると(たとえば、キーを左シフトまたは右シフトすると)、セキュリティが向上しますか?

コードにソルトを格納するのはどうですか(ハードコーディング)?

4
Rak

パスワードベースのキー導出(PBKD)の問題は、パスワードがユーザーからのものである場合、攻撃者がパスワードを推測できることです。しかし、私の場合、パスフレーズとして(ユーザーではなく)長いシステムベースの番号を使用しています。これは正しい方法ですか?

パスワードは「ユーザーの頭に合う秘密の鍵」です。秘密鍵の主な属性はその秘密性です。これは、攻撃者がそれを知らない程度の尺度です。一般的に言って、攻撃者は(想定される)超スマートであるため、知らないのは純粋なランダム性だけです。

passwordsの主な問題は、人間の脳はランダム性を保存するのが得意ではないことです(ランダム性の生成も非常に貧弱です)。これがパスワードを弱くする理由です。攻撃者は「推測」によってパスワードを見つけようとする可能性があります。これは基本的に、人間と互換性のあるランダム性のすべての組み合わせを試すことを意味します。

PBKDF2は、他の password-hashing functions と同様に、(攻撃者と通常のユーザーの両方にとって)それぞれの推測をより高価にすることにより、パスワードの脆弱性をより許容できるようにすることを目的としています。

アプリケーションで、パスワードが実際にはユーザーではなくマシンによって入力された場合、ランダム性の多い「パスワード」を使用できます(マシンは、乱数の長いシーケンスを覚えている点で、人間よりもはるかに優れています)。どの時点でパスワードハッシュがまったく役に立たなくなる可能性があります。

コードの暗号化キーを変更すると(たとえば、キーを左シフトまたは右シフトすると)、セキュリティが向上しますか?

Huitzilopochtliの栄光を唱えれば、次の当選番号を推測するのに役立ちますが、頭にティーポットを置いて踊るのと同じくらい役立ちます。

(Huitzilopochtliがあなたの儀式で本当に面白がっている場合、彼はあなたにいくつかの利益を与えるかもしれませんが、彼はユーモアのセンスで本当に知られていません。)

コードにソルトを格納するのはどうですか(ハードコーディング)?

ソルトは、パスワードハッシュと組み合わせて意味があります。これは、パスワード(本質的に脆弱で、上記を参照)を許容できる方法の1つです。 「パスワード」が実際にはパスワードではない場合、パスワードのハッシュとソルトは関係ありません。

逆に、ソルトが関連する場合は、その主な唯一のポイントが再利用されることはありません。コードにソルトをハードコーディングすると、まったく逆になります。

したがって、salt値をハードコーディングすることは、コンテキストに応じて、悪い考えであるか、またはvery悪い考えであると言えます。

2
Tom Leek

ハードウェアが比較的安全(または重い)であり、ハードディスクが盗まれて解読されるのが心配な場合は、物理的なセキュリティがロジックと同じくらい重要であることを覚えてから、シリアル番号(少なくとも2つ)などのハードウェア情報を使用してください。そうすることで、ドライブは適切なハードウェア内になければ復号化できません。

追加のレイヤーとソルトに関しては、暗号化スクリプトと復号化スクリプトを難読化し、ハードコードされたソルトで問題ないことを確認してください。

私はあなたのシナリオを100%理解しているわけではありませんが、暗号化、復号化などがどのように機能するかは、実行可能なソルトが何であるかによって異なります。特に、ソルトを各ファイルに対して動的にできる場合、これは、ハードウェアを盗んで、残りのファイルを復号化できないソルトを1ファイルと推測しました。

シナリオの詳細を知っていれば、いくつかの提案をすることができるかもしれませんが、一部の情報を共有するべきではありません(ソーシャルエンジニアリング)

これがいくつかのアイデアに火をつけることを望みます。

1
TheHidden

[〜#〜] kdf [〜#〜] パスワードを強化する必要があるのは、パスワード自体が弱い可能性がある場合のみです。典型的な例は、人間がそれを生成したときです。

KDFはパスワードハッシュを何度も繰り返します。つまり、パスワードハッシュにアクセスする攻撃者は、各パスワードをその回数だけ繰り返す必要があり、攻撃が遅くなります。これは、KDFを使用しない強力なパスワードと同じ効果があります。これは、エントロピーが大きいパスワードが持つ追加のキースペースでは、解読に必要な時間を考慮して追加のハッシュ反復を置き換えることができるためです。

したがって、コンピュータで生成されたパスワードは、それ自体で十分な強度を持つキーを簡単に生成できるため、 キーストレッチング のKDFは必要ありません。暗号化された安全な乱数ジェネレータ(CSPRNG)によって生成された、可能な場合は128ビットのエントロピーを使用します。

塩について-あなたはそれを必要としません。本質的にハッシュ攻撃からパスワードを保護するには、128ビットで十分です。 128ビットのキースペース全体をカバーするレインボーテーブルは、実行できないほど大きくなります。

1
SilverlightFox

「長いシステムベースの数」と言うとき、正確にはどういう意味ですか?鍵生成関数への唯一の入力がマシンに保存されている静的定数である場合、暗号化はそれにアクセスする攻撃者に対して何もしません。ただし、別のマシンでデータを持ち上げて解読することはできません。

ユーザー提供のパスワードに基づいてキーを生成すると、攻撃者はデバイスからデータを抽出するために外部情報を必要とします。もちろん、これはユーザーが良いパスワードを選択する必要があることを意味しますが、マシン自体にパスワードを保存するよりも賢明だと思います!パスワードが適切に選択されている場合(長いパスフレーズなど)、攻撃者は1000年以内にパスワードを推測することはできません。

キーソースの選択は、ユースケースによって異なります。 2つを組み合わせることもできます(たとえば、Windowsは、ハードウェアのセキュリティチップとユーザーのパスワードに依存する暗号化サービスを提供しています)。

ソルトは、事前に計算されたハッシュテーブルでハッシュされたシークレットを攻撃しにくくするために使用されます。最も一般的なアプリケーションはパスワードストレージです。攻撃者が一般的なパスワードとそのハッシュの大量のリストを作成できる場合、パスワードハッシュを簡単に検索して、同等の平文を見つけることができます。パスワードにソルトを追加して結果をハッシュすると、これははるかに困難になります。

ただし、ここではソルトがどのように適用されるのかわかりません。大量のデータを暗号化しており、ハッシュしていない。攻撃者がすべての可能なファイルとそのすべての可能な暗号化されたバージョンでテーブルを作成する方法はありません。

また、accessシークレットで利用できる必要があるため、塩はシークレットではありません。 obfuscatesaltは(たとえば、ファイル名を使用して)できるかもしれませんが、セキュリティの黄金のルールを思い出してください。

あいまいさによるセキュリティはセキュリティではありません。攻撃者がキー以外のすべてを知っていると想定します。

これはあなたが育てた他のいくつかにも当てはまります-暗号化機能をランダムにいじるとうまくいきません。

粗末なシステムではなく、堅牢なシステムを構築します。

0
etherealflux