web-dev-qa-db-ja.com

パスワードベースの非対称キー生成

非対称のキーペアとなるパスワードベースのキー導出スキームを探しています。私はPBKDFとそのバリアントを使用しましたが、キーペアを生成する方法を思いつきませんでした。私はオンラインで物事を勉強しましたが、パスワードは循環グループなどからのものでなければならないので、パスワードの制限は私には合いません。どんな方向でも大歓迎です!

2

非対称鍵ペアの生成は、ランダムなソースに基づく決定論的アルゴリズムとして説明できます。したがって、一般的に言えば、次の操作を行うことにより、パスワードを公開/秘密鍵のペアに変換できます。

  1. パスワードハッシュ関数 を使用して、パスワードを十分な長さ(たとえば、少なくとも128ビット)の「シード」に処理します。

  2. そのシードを 暗号的に安全なPRNG にフィードして、そのシードを必要なだけの疑似ランダムビットに拡張します。

  3. シードされたCSPRNGをランダム性のソースとして使用して、鍵ペア生成アルゴリズムを実行します。

この種のプロセスには、注意すべきいくつかの重要な欠点があります。

  • 完全に指定され、変更されない鍵ペア生成アルゴリズムが必要です。たとえば、RSAの場合、アルゴリズムconceptは、適切なサイズの素数の整数が見つかるまで乱数を生成しますが、パスワードベースの設定では、ランダムビットを候補整数に正確に変換する方法など、非常に正確でなければなりません。

    ECDSA/ECDHのような楕円曲線ベースのアルゴリズムを使用すると役立つ場合があります。秘密鍵は単なるランダムな整数であり、素数性などの条件がないためです。生成アルゴリズムを指定する必要がありますが、少なくともsimpleです。

  • パスワードを変更すると、キーペアも変更されます。これは、想定しているシステムに影響を与える可能性があります。

  • 適切なパスワードハッシュにはsaltが必要ですが、これは秘密の値ではありませんが、修正する必要はありません。どこかにその塩の保管スペースが必要になります。

  • 結果の公開鍵は、構造上、 オフライン辞書攻撃 で使用できます。オフライン辞書攻撃は、パスワードにとって良いことではありません。適切に構成されたパスワードハッシュ関数は、辞書攻撃を防ぐのに役立ちますが、その能力には限界があります。したがって、パスワードで生成された公開鍵には、本当にランダムなパスワードが必要です。残念ながら、本当にランダムなパスワードは覚えるのが難しいです(いくつかの議論については この質問 を参照してください-投稿で提示されている「正しい馬」の方法は、44ビットのエントロピーを持つパスワードを生成します。パスワードですが、オフライン辞書攻撃を許容できるほど十分ではありません)。

2
Tom Leek