Генерация случайного пароля навалом

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

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 ответов

Решение

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 символов.

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

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

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

Смотреть на:

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

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

Вы можете использовать класс Membership от 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: Membership.GeneratePassword Метод

Как ни странно, у вас были бы лучшие результаты, если бы вы использовали последние символы 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;
}
Другие вопросы по тегам