<%--兼容IE7 必须放在 head 的第一行--%>
独上高楼网站
  • 在.NET中产生随机密码字符串
  • using System;
    using System.Security.Cryptography;
    using System.Text;

    namespace Utility {
    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) {
    // 假定 lBound >= 0 && lBound < uBound
    // 返回一个 int >= lBound and < uBound
    uint urndnum;
    byte[] rndnum = new Byte[4];

    if (lBound == uBound-1) {
    // 只有iBound返回的情况
    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() {
    // 得到minimum 和 maximum 之间随机的长度
    int pwdLength = GetCryptographicRandomNumber(this.Minimum, this.Maximum);
    StringBuilder pwdBuffer = new StringBuilder();
    pwdBuffer.Capacity = this.Maximum;
    // 产生随机字符
    char lastCharacter, nextCharacter;
    // 初始化标记
    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 bool ConsecutiveCharacters {
    get { return this.hasConsecutive; }
    set { this.hasConsecutive = value;}
    }

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

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

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

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

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


    private const int DefaultMaximum = 10;
    private const int DefaultMinimum = 6;
    private const int UBoundDigit = 61;
    private string exclusionSet;
    private bool hasConsecutive;
    private bool hasRepeating;
    private bool hasSymbols;
    private int maxSize;
    private int minSize;
    private char[] pwdCharArray = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567
    89`~!@#$^*()-_=+[]{}\\|;:'\",./".ToCharArray();
    private RNGCryptoServiceProvider rng;
    }
    }
  • 与本文主题相关的文章