私が取り組んでいる例はこれです:
argon2を使用してユーザーパスワードをデータベースに保存します
pBKDF2を使用してユーザーパスワードからAESキーを取得し、PBKDF2で使用されるソルトのみを保存します。この関数の出力を使用して、ユーザーの一部のファイルを暗号化します
私の質問はこの方法が安全ですか?
互いに独立した複数のパスワードハッシュアルゴリズムを使用して同じパスワードを処理する場合、パスワードは最も弱いアルゴリズムだけでなく保護されます。 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に割り当てている場合、セキュリティ上の問題はありません。