6

ランダムなパスワードを作成するために現在行っていることは次のとおりです。

    public static int getRandomNumber(int maxNumber)
    {
        if (maxNumber < 1)
            throw new System.Exception("The maxNumber value should be greater than 1");
        byte[] b = new byte[4];
        new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(b);
        int seed = (b[0] & 0x7f) << 24 | b[1] << 16 | b[2] << 8 | b[3];
        System.Random r = new System.Random(seed);
        return r.Next(1, maxNumber);
    }

考えられる問題はありますか?これは、セキュリティで保護されていない可能性のあるいくつかの奇妙なシード パターンを持つ静的関数であり、依然として System.Random() を使用しています。

上記の乱数ジェネレーターを使用して、次の非効率的な方法で文字列を作成します。

  validCharacters = "abcdefghjkmnoxyz023456789#!@";

次にループして、有効な配列を使用して「createPassword(length)」タイプの文字列を取得します (1 i などの間違いやすい文字を含まない文字セットの使用に注意してください)。

これはその方法ですか、それとももっと簡単で、より安全で、より効果的な方法はありますか?

4

4 に答える 4

2

を使用System.Randomすると、出力が暗号的に強力ではないため、セキュリティ プロパティのアサートが非常に難しくなります。可能なシードは 40 億しかないため、現在、パスワードは 40 億しかありません。

非常に危険です。同様の問題が原因で、Debian のパスワード セキュリティが侵害されました。

直接使用RNGCryptoServiceProviderして、パスワード アルゴリズムの入力として完全にランダムな int を生成します。

于 2014-03-11T21:20:47.697 に答える
0

生のバイトを取得し、有効な文字列を基数 28 の数値の「数字」として使用して、基数 28 でエンコードすることができます。ここでコードを使用できますhttps://stackoverflow.com/a/14110071/2076

于 2014-09-16T17:27:12.763 に答える
0

RNGCryptoServiceProvider を使用して System.Random から継承して数値を取得できますが、かなりの数のメソッドをオーバーライドする必要があるため、注意が必要です。

/*
[MSDN]

Notes to Inheritors:

In the .NET Framework versions 1.0 and 1.1, a minimum implementation of
a class derived from Random required overriding the Sample method
to define a new or modified algorithm for generating random numbers.
The derived class could then rely on the base class implementation
of the Random.Next(), Random.Next(Int32), Random.Next(Int32, Int32),
NextBytes, and NextDouble methods to call the derived class implementation of the Sample method.

In the .NET Framework version 2.0 and later, the behavior of the Random.Next(),
Random.Next(Int32, Int32), and NextBytes methods have changed
so that these methods do not necessarily call the derived class implementation
of the Sample method.
As a result, classes derived from Random that target the .NET Framework 2.0
and later should also override these three methods.
*/
class CryptoRandom : System.Random {
    private RandomNumberGenerator rng;
    public CryptoRandom() {
        rng = new RNGCryptoServiceProvider();
    }
    public override int Next() {
        byte[] bytes = new byte[4];
        rng.GetBytes(bytes);
        return int.MaxValue & BitConverter.ToInt32(bytes, 0);
    }
    public override void NextBytes(byte[] b)
    {
        rng.GetBytes(b);
    }
    public override int Next(int lo, int hi){
        throw new Exception("TODO override (arc4random_uniform is beautiful)");
    }
    protected override double Sample()
    {
        throw new Exception("TODO override");
    }
}

または、これをすべて使用して小さな (長さ <=255) 文字列にインデックスを取得するため、バイトを直接使用してインデックスを取得することができます (モジュロ バイアスを回避するため、この回答を書きました最初に -- http://BXR.SU/OpenBSD/lib/libc/crypt/arc4random_uniform.c#arc4random_uniformの arc4random_uniform を参照してください)。

于 2014-03-12T14:48:30.930 に答える