Генерация случайного пароля навалом - PullRequest
4 голосов
/ 31 мая 2011

Я использую этот исходный код для генерации случайных паролей:

public string GetRandomPasswordUsingGUID(int length)
{
    // Get the GUID
    string guidResult = System.Guid.NewGuid().ToString();

    // Remove the hyphens
    guidResult = guidResult.Replace("-", string.Empty);

    // Make sure length is valid
    if (length <= 0 || length > guidResult.Length)
        throw new ArgumentException("Length must be between 1 and " + guidResult.Length);

    // Return the first length bytes
    return guidResult.Substring(0, length).ToUpper();
}

Работает нормально, когда вы вызываете метод, но не в операторе цикла for.

В этом случае он генерирует некоторый повторный пароль, который является неправильным.

например, вот так:

A4MNB597D7
AMGJCCC902
AWJ80CF6HX
A78EDJECIW
A78EDJECIW
A78EDJECIW
A78EDJECIW
A78EDJECIW
A2LYJCH23N
A2LYJCH23N

Как создать случайный пароль в цикле «For»?

Ответы [ 5 ]

7 голосов
/ 31 мая 2011

GUID не случайны, они уникальны (в пределах одной системы).Даже генератор случайных чисел имеет ограничения на него, минимальные и максимальные значения, которые он будет возвращать, и, будучи действительно случайным, означает, что вы можете получать один и тот же результат снова и снова, вы просто не можете сказать.

Являетесь ли выВы имеете в виду случайное, а не сильное?

XKCD http://xkcd.com/221/

Хорошо, теперь у нас есть представление о том, что вам нужно 500 -1000 уникальных паролей.Я бы поставил под сомнение необходимость уникальности, поскольку предположил бы, что они предназначены для учетной записи пользователя, однако ... (введено без использования VS)

List<string> passwords = new List<string>();

while (passwords.Length < 1000)
{
    string generated = System.Web.Security.Membership.GeneratePassword(
                           10, // maximum length
                           3)  // number of non-ASCII characters.
    if (!passwords.Contains(generated))
        passwords.Add(generated);
}

И тогда у вас будет список1000 уникальных паролей, которые могут содержать не более 10 символов и 3 не-ASCII символа.

3 голосов
/ 31 мая 2011

Это не ответ конкретно на вопрос, но именно поэтому ваше решение GUID не будет работать:

http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx

2 голосов
/ 31 мая 2011

Если вы собираетесь генерировать случайные пароли в сборке, я настоятельно рекомендую не использовать «NewGuid ()», поскольку на основе алгоритма генерации сегментов UUID их основаны на уникальной временной метке ~ 100 мс.

Посмотрите на:

http://en.wikipedia.org/wiki/Universally_unique_identifier

Было бы лучше создать таблицу поиска разрешенных символов и использовать статический объект "Случайный" и индексировать символы в таблице на основена случайное число генерируется.

1 голос
/ 24 сентября 2012

Вы можете использовать класс Membersp в Asp.net, в который встроен генератор паролей. Он находится в пространстве имен System.Web.Security в dll System.Web.

// Generate a new 12-character password with 1 non-alphanumeric character.
  string password = Membership.GeneratePassword(12, 1);

Подробнее здесь: MSDN: членство. Генерировать метод пароля:

1 голос
/ 31 мая 2011

Как ни странно, у вас были бы лучшие результаты, если бы вы использовали последний символов вашего GUID, а не первый.

Чтобы ответить на ваш вопрос, достаточно примерно такого:

private static Random rng=new Random();
private static string PasswordAlphabet="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

public string GetRandomPasswordUsingGUID(int length)
{
  string result="";

  while(length-->0)
    result+=PasswordAlphabet[rng.Next(PasswordAlphabet.Length)];

  return result;
}
...