web-dev-qa-db-ja.com

1つのパスワードに対して2つのパスワード導出関数を使用しても安全ですか?

私が取り組んでいる例はこれです:

argon2を使用してユーザーパスワードをデータベースに保存します

pBKDF2を使用してユーザーパスワードからAESキーを取得し、PBKDF2で使用されるソルトのみを保存します。この関数の出力を使用して、ユーザーの一部のファイルを暗号化します

私の質問はこの方法が安全ですか?

1
user212160

互いに独立した複数のパスワードハッシュアルゴリズムを使用して同じパスワードを処理する場合、パスワードは最も弱いアルゴリズムだけでなく保護されます。 PBKDF2はArgon2よりクラックが発生しやすくなっています。数バイトの暗号文しか持たない攻撃者は、パスワードをブルートフォースしてPBKDF2のみを攻撃し、Argon2をバイパスすることができます。

Argon2(PBKDF2(pwd))またはPBKDF2(Argon2(pwd))のように、それらを順次処理する場合、それはもう問題ではありません。 (中間ハッシュ出力を他のものに使用しない限り)。

それはまだ悪い考えです。 CPU時間の100%をArgon2に割り当てる方が、2つの時間を共有するよりも優れています。時間を50-50に分割する代わりに、PBKDF2で浪費しているその50%を使用して、Argon2のコストパラメータの1つを増やすことができます。

この余分な時間を使用して、メモリコストを増やすことで、より多くのRAM=を埋めることができます。これにより、ハッシュの並列化が困難になり、攻撃者のパスワードハッシュレートが低下します。メモリコストを増やすと、各Argon2の実行時間も長くなります攻撃者の評価。ハッシュレートをさらに下げます。

または、それを使用して時間コストを増やすこともできます。これにより、Argon2は割り当てられたメモリに対してより多くのパスを実行します。各評価に時間がかかるため、攻撃者のハッシュレートが低下します。また、まだ複数の反復を使用していない場合は、time-memory-tradeoff攻撃の効果を減らすのにも役立ちます。 (推奨される反復回数で既に使用している場合は、メモリコストを増やすことをお勧めします。)

Argon2は、ユーザー認証だけでなく、キーの導出にも使用できます。何らかの理由でそれができない場合は、Argon2を使用して1つのマスターキーを取得し、そのキーをRAMで保持して、他のキーの派生に使用します。キーベースのKDFと同様にパスワードベースのKDF(HKDFなど)。

技術的にPBKDF2をc = 1(1回の反復)で使用すると、キーベースのKDFとして使用できます。 (Scryptはこの手法を使用します。)パスワード拡張予算の0.00000000000001%のみをPBKDFに割り当てている場合、セキュリティ上の問題はありません。

3
Future Security