1

次のコードは、PRNG(疑似乱数ジェネレーター)Randomクラスを使用して、本来使用されていた暗号化された安全性の代わりに、初期一時パスワードのパスワード文字を生成しますRNGCryptoServiceProvider

ただし、PRNGのシードを生成するためにを使用するため、セキュリティが問題にならないPRNGを使用する場合の一般的な方法のように、現在の時刻に基づいてシードするのではなく、何かRNGCryptoServiceProvider価値があると思います。

私の質問は、パスワード生成システムを危険にさらし、新しいユーザーのパスワードを推測するために、この攻撃を行うのはどれほど簡単か難しいかということです。

// Generate 4 random bytes.
byte[] randomBytes = new byte[4];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(randomBytes);

// Convert 4 bytes into a 32-bit integer value.
int seed = (randomBytes[0] & 0x7f) << 24 | randomBytes[1] << 16 | randomBytes[2] << 8 | randomBytes[3];

// Now, this is real randomization.
Random random = new Random(seed);

次に、コードrandom.Next()はパスワード文字列を入力するための文字を生成するために使用します。

免責事項:このコードは私の発明ではありません。それについて私を責めたり、それを修正する方法についての提案を提供したりしないでください。私はそれを修正する方法を知っています、そして私はそれが悪いことを知っています。そのように返信する時間を無駄にしないでください。この効果に対するコメントまたは回答は、スパムとしてフラグが付けられます。私はそれを私たちのコードで見つけただけで、その「セキュリティ」プロパティに興味があります。

4

1 に答える 1

5

PRNG関数の問題は、予測可能性の問題です。以前の出力に基づいて出力を予測できること。クラスの使用を避ける理由は、Randomクラスの出力を監視することで、将来の出力の予測を開始できるためです。

上記のコードは問題がある場合とない場合があります。Randomこれは、クラスがインスタンス化される頻度に要約されます。暗号強度PRNGからのシードを使用して新しいインスタンスを作成し、そこから1つのパスワードのみを生成する場合は、問題ないはずです。これは、生成された1つのパスワードからPRNGの状態を学習しても、将来生成されるパスワードとは関係がないためです。

代わりに、このルーチンを使用しての静的インスタンスを初期化する場合はRandom、確かに潜在的な問題があります。誰かがこのアプローチを使用して一時的なリセットパスワードを電子メールに送信したとしましょう。攻撃者は、将来のパスワードの予測を開始するのに十分な回数、自分のパスワードをリセットする可能性があります。次のパスワードを予測できるようになると、侵害したいアカウントの残りのパスワードを開始するだけです。電子メールで送信されたパスワードをすでに知っているので、彼はアカウントにアクセスできます。

于 2013-01-07T17:32:34.103 に答える