Код для генератора паролей - PullRequest
13 голосов
/ 09 марта 2011

Я работаю над проектом C #, где мне нужно генерировать случайные пароли.

Может ли кто-нибудь предоставить какой-нибудь код или высокоуровневый подход для генерации пароля?

Должно быть возможно указать следующее:

  1. Минимальная длина пароля
  2. Максимальная длина пароля
  3. Допустимые заглавные буквы
  4. Минимальное количество прописных букв
  5. Действительные строчные буквы
  6. Минимальное количество строчных букв
  7. Действительные числовые символы
  8. Минимальное количество числовых символов
  9. Действительные алфановые символы.
  10. Минимальное количество альфанумных символов

Ответы [ 6 ]

23 голосов
/ 09 марта 2011

вы можете использовать этот метод и изменить в соответствии с вашими потребностями

private static string CreateRandomPassword(int passwordLength)
{
 string allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789!@$?_-";
 char[] chars = new char[passwordLength];
 Random rd = new Random();

 for (int i = 0; i < passwordLength; i++)
 {
  chars[i] = allowedChars[rd.Next(0, allowedChars.Length)];
 }

 return new string(chars);
}
5 голосов
/ 09 марта 2011

Много лет назад я написал простую библиотеку для генерации данных, чтобы смоделировать некоторые данные, которые нам нужны, вы могли бы взглянуть на это, чтобы получить некоторые идеи. Вы предоставляете ему шаблон, который вы хотите сгенерировать, и он будет создавать случайные данные, соответствующие этому шаблону.

Шаблон выглядит следующим образом:

  • * - Прописная или строчная буква или цифра.
  • L - Буква в верхнем регистре.
  • l - строчная буква.
  • V - гласный в верхнем регистре.
  • v - гласный в нижнем регистре.
  • C - Согласный в верхнем регистре.
  • c - согласный в нижнем регистре.
  • X - любое число, 0-9.
  • x - любое число, 1-9.

Это не совсем то, что вы ищете, но вы должны иметь возможность изменить его в соответствии с вашими потребностями.

Это основная логика
РЕДАКТИРОВАТЬ: Прочитав ваши требования еще раз, я думаю, вы должны быть в состоянии изменить мой код, чтобы заставить его работать. Вам потребуется создать шаблон, который соответствует минимальным требованиям к символам / числам для действительного пароля, добавить логику для изменения длины сгенерированного пароля путем добавления случайных символов и, возможно, добавить некоторую логику случайной сортировки в конце, чтобы смешать символы так, чтобы они не всегда были в одном и том же порядке.

EDIT (2): перемещен код на GitHub, обновлены ссылки.

РЕДАКТИРОВАТЬ (3): вместо этого связаны с основным репозиторием Github.

3 голосов
/ 09 марта 2011

Вы смотрели пример кода проекта?

http://www.codeproject.com/KB/cs/pwdgen.aspx

2 голосов
/ 09 марта 2011

Генератор паролей AC #

namespace WorkingCode.CodeProject.PwdGen
{
    using System;
    using System.Security.Cryptography;
    using System.Text;

    public class PasswordGenerator
    {
        public PasswordGenerator() 
        {
            this.Minimum               = DefaultMinimum;
            this.Maximum               = DefaultMaximum;
            this.ConsecutiveCharacters = false;
            this.RepeatCharacters      = true;
            this.ExcludeSymbols        = false;
            this.Exclusions            = null;

            rng = new RNGCryptoServiceProvider();
        }       

        protected int GetCryptographicRandomNumber(int lBound, int uBound)
        {   
            // Assumes lBound >= 0 && lBound < uBound

            // returns an int >= lBound and < uBound

            uint urndnum;   
            byte[] rndnum = new Byte[4];   
            if (lBound == uBound-1)  
            {
                // test for degenerate case where only lBound can be returned

                return lBound;
            }

            uint xcludeRndBase = (uint.MaxValue -
                (uint.MaxValue%(uint)(uBound-lBound)));   

            do 
            {      
                rng.GetBytes(rndnum);      
                urndnum = System.BitConverter.ToUInt32(rndnum,0);      
            } while (urndnum >= xcludeRndBase);   

            return (int)(urndnum % (uBound-lBound)) + lBound;
        }

        protected char GetRandomCharacter()
        {            
            int upperBound = pwdCharArray.GetUpperBound(0);

            if ( true == this.ExcludeSymbols )
            {
                upperBound = PasswordGenerator.UBoundDigit;
            }

            int randomCharPosition = GetCryptographicRandomNumber(
                pwdCharArray.GetLowerBound(0), upperBound);

            char randomChar = pwdCharArray[randomCharPosition];

            return randomChar;
        }

        public string Generate()
        {
            // Pick random length between minimum and maximum   

            int pwdLength = GetCryptographicRandomNumber(this.Minimum,
                this.Maximum);

            StringBuilder pwdBuffer = new StringBuilder();
            pwdBuffer.Capacity = this.Maximum;

            // Generate random characters

            char lastCharacter, nextCharacter;

            // Initial dummy character flag

            lastCharacter = nextCharacter = '\n';

            for ( int i = 0; i < pwdLength; i++ )
            {
                nextCharacter = GetRandomCharacter();

                if ( false == this.ConsecutiveCharacters )
                {
                    while ( lastCharacter == nextCharacter )
                    {
                        nextCharacter = GetRandomCharacter();
                    }
                }

                if ( false == this.RepeatCharacters )
                {
                    string temp = pwdBuffer.ToString();
                    int duplicateIndex = temp.IndexOf(nextCharacter);
                    while ( -1 != duplicateIndex )
                    {
                        nextCharacter = GetRandomCharacter();
                        duplicateIndex = temp.IndexOf(nextCharacter);
                    }
                }

                if ( ( null != this.Exclusions ) )
                {
                    while ( -1 != this.Exclusions.IndexOf(nextCharacter) )
                    {
                        nextCharacter = GetRandomCharacter();
                    }
                }

                pwdBuffer.Append(nextCharacter);
                lastCharacter = nextCharacter;
            }

            if ( null != pwdBuffer )
            {
                return pwdBuffer.ToString();
            }
            else
            {
                return String.Empty;
            }   
        }

        public string Exclusions
        {
            get { return this.exclusionSet;  }
            set { this.exclusionSet = value; }
        }

        public int Minimum
        {
            get { return this.minSize; }
            set 
            { 
                this.minSize = value;
                if ( PasswordGenerator.DefaultMinimum > this.minSize )
                {
                    this.minSize = PasswordGenerator.DefaultMinimum;
                }
            }
        }

        public int Maximum
        {
            get { return this.maxSize; }
            set 
            { 
                this.maxSize = value;
                if ( this.minSize >= this.maxSize )
                {
                    this.maxSize = PasswordGenerator.DefaultMaximum;
                }
            }
        }

        public bool ExcludeSymbols
        {
            get { return this.hasSymbols; }
            set { this.hasSymbols = value;}
        }

        public bool RepeatCharacters
        {
            get { return this.hasRepeating; }
            set { this.hasRepeating = value;}
        }

        public bool ConsecutiveCharacters
        {
            get { return this.hasConsecutive; }
            set { this.hasConsecutive = value;}
        }

        private const int DefaultMinimum = 6;
        private const int DefaultMaximum = 10;
        private const int UBoundDigit    = 61;

        private RNGCryptoServiceProvider    rng;
        private int             minSize;
        private int             maxSize;
        private bool            hasRepeating;
        private bool            hasConsecutive;
        private bool            hasSymbols;
        private string          exclusionSet;
        private char[] pwdCharArray = "abcdefghijklmnopqrstuvwxyzABCDEFG" +
            "HIJKLMNOPQRSTUVWXYZ0123456789`~!@#$%^&*()-_=+[]{}\\|;:'\",<" + 
            ".>/?".ToCharArray();                                        
    }
}

Я также нашел

http://www.codeproject.com/KB/cs/password-generator.aspx

http://www.codesnipr.com/snippet/504/c-Random-password-generator

http://www.yetanotherchris.me/home/2009/3/15/c-pronounceable-password-generator.html

1 голос
/ 30 апреля 2014

Взял генератор паролей из проекта кода, очистил код и исправил логическую ошибку в настройщике свойства Maximum.

1 голос
/ 09 марта 2011

это помогает?Вы могли бы найти его с помощью Google.) C # Password Generator

...