C#随机生成符合要求的密码并判断强弱

该代码示例展示了一个C#类,用于生成包含特定数量的小写字母、大写字母、数字和特殊字符的随机密码。它还包含了密码强度的评估功能,根据密码的组成和长度将其分为弱、好、强和非常强四个等级。类的实现基于伪随机数生成器,确保了密码的随机性。
摘要由CSDN通过智能技术生成

用户的密码设定是网络安全的重中之重,生成安全密码,在重要的网络数据安全中尤显重要。重要的用户密码很需要帮助他们随机生成高强度的密码。一般随机数都是伪随机,我们需要不同的种子,让它无限接近于真随机。下面就是一个生成随机密码的类,并根据密码的长度和密码字符的种类进行赋值判断强度。

using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;

namespace GeneratePassword
{
    public partial class GeneratePassword
    {
        private const int minimumNumberOfChars = 4;//最小密码长度

        /// <summary>
        /// 随机生成密码
        /// </summary>
        /// <param name="mumNumberOfChars" 指定的密码长度></param>
        /// <param name="minimumLowerCaseChars" 小写字母最小位数></param>
        /// <param name="minimumUpperCaseChars" 大写字母最小位数></param>
        /// <param name="minimumNumericChars" 数字最小位数></param>
        /// <param name="minimumSpecialChars" 特殊字符最小位数></param>
        /// <returns>"GeneratePassword"</returns>
        public string GenerateNewPassword(int mumNumberOfChars, int minimumLowerCaseChars, int minimumUpperCaseChars, int minimumNumericChars, int minimumSpecialChars)
        {
            if (mumNumberOfChars < minimumNumberOfChars)
            {
                throw new ArgumentException("最小密码长度不能小于4位!");
            }
            if (minimumLowerCaseChars < 0 || minimumUpperCaseChars < 0 || minimumNumericChars < 0 || minimumSpecialChars < 0)
            {
                throw new ArgumentException("参数不能小于0!");
            }
            if (mumNumberOfChars < minimumLowerCaseChars + minimumUpperCaseChars + minimumNumericChars + minimumSpecialChars)
            {
                throw new ArgumentException("密码长度不能小于4个分类字符最小位数之和!");
            }
            string allAvailableChars;
            var allLowerCaseChars = "abcdefghijkmnpqrstuvwxyz";//不使用ol,避免混淆或看不清,以下同
            var allUpperCaseChars = "ABCDEFGHIJKLMNPQRSTUVWXYZ";//不使用O
            var allNumericChars = "23456789";//不使用01
            var allSpecialChars = @"~!@#$%&*_-+=|\(){}[]<>?/";//不使用^`:;,.
            StringBuilder stringBuilder = new();
            stringBuilder.Append(GetOnlyIfOneCharIsRequired(mumNumberOfChars, minimumLowerCaseChars, allLowerCaseChars));
            stringBuilder.Append(GetOnlyIfOneCharIsRequired(mumNumberOfChars, minimumUpperCaseChars, allUpperCaseChars));
            stringBuilder.Append(GetOnlyIfOneCharIsRequired(mumNumberOfChars, minimumNumericChars, allNumericChars));
            stringBuilder.Append(GetOnlyIfOneCharIsRequired(mumNumberOfChars, minimumSpecialChars, allSpecialChars));
            allAvailableChars = stringBuilder.ToString();
            return GetRandomString(allAvailableChars, mumNumberOfChars);

        }
        private string GetOnlyIfOneCharIsRequired(int mumNumberOfChars, int minimum, string allChars)
        {
            return minimum > 0 || mumNumberOfChars == 0 ? allChars : string.Empty;
        }
        private string GetRandomString(string possibleChars, int lenght)
        {
            var result = string.Empty;
            for (var position = 0; position < lenght; position++)
            {
                var index = Next(possibleChars.Length);
                result += possibleChars[index];
            }
            return result;
        }
        private int Next()
        {
            var randomBuffer = new byte[4];
            using (var generator = RandomNumberGenerator.Create())
            {
                generator.GetBytes(randomBuffer);
            }
            var result = BitConverter.ToInt32(randomBuffer, 0);
            return result;
        }

        private int Next(int maximumValue)
        {
            // 不要使用Next()%maximumValue,因为分布不正常
            return Next(0, maximumValue);
        }

        private int Next(int minimumValue, int maximumValue)
        {
            var seed = Next();

            //  在给定范围内生成均匀分布的随机整数。
            return new Random(seed).Next(minimumValue, maximumValue);
        }

        public string GetPasswordStrength(string password)
        {
            if (password == null || password.Length < minimumNumberOfChars)
            {
                throw new ArgumentException("密码不能为空或小于4位数");
            }
            var result = string.Empty;
            var count = 0;

            if (NumberRegex().IsMatch(password))
            {
                count += 10;
            }
            if (LowerRegex().IsMatch(password))
            {
                count += 26;
            }
            if (UpperRegex().IsMatch(password))
            {
                count += 26;
            }
            if (PunctuationRegex().IsMatch(password))
            {
                count += 31;
            }

            double strength = Math.Log(Math.Pow(count, password.Length)) / Math.Log(2);

            if (strength <= 32) { result = "Weak"; }
            else if (strength <= 64) { result = "Good"; }
            else if (strength <= 128) { result = "Strong"; }
            else if (strength > 128) { result = "Very strong"; }
            return result;
        }

        [GeneratedRegex("[\\d]")]
        private static partial Regex NumberRegex();
        [GeneratedRegex("[a-z]")]
        private static partial Regex LowerRegex();
        [GeneratedRegex("[A-Z]")]
        private static partial Regex UpperRegex();
        [GeneratedRegex("[\\W|_]")]
        private static partial Regex PunctuationRegex();
    }
}

这个类是根据 https://github.com/it-nilesh/password-generator/blob/master/PasswordGenerator 的源码简化修改而成。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用C#内置的`Random`类来生成随机密码,然后使用密码强度校验器来确保密码强度。以下是一个示例代码: ```csharp using System; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Web.Security; public static class PasswordGenerator { private static readonly Random Random = new Random(); public static string GeneratePassword(int length = 12) { const string validChars = "ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*?_-"; var password = new char[length]; for (var i = 0; i < length; i++) { var index = Random.Next(validChars.Length); password[i] = validChars[index]; } var passwordString = new string(password); var passwordValidator = new PasswordStrengthChecker(); var validationResult = passwordValidator.CheckPasswordStrength(passwordString); if (validationResult > MembershipPasswordStrength.Strong) { return passwordString; } return GeneratePassword(length); } } public class PasswordStrengthChecker { public MembershipPasswordStrength CheckPasswordStrength(string password) { var score = 0; var hasDigit = false; var hasLowerCase = false; var hasUpperCase = false; var hasNonAlphanumeric = false; foreach (var c in password) { if (char.IsDigit(c)) { hasDigit = true; score += 1; } else if (char.IsLower(c)) { hasLowerCase = true; score += 1; } else if (char.IsUpper(c)) { hasUpperCase = true; score += 1; } else { hasNonAlphanumeric = true; score += 2; } } if (!hasDigit || !hasLowerCase || !hasUpperCase || !hasNonAlphanumeric) { score = Math.Max(1, score); } if (password.Length < 8) { score = Math.Max(1, score); } else if (password.Length < 11) { score += 1; } else { score += 2; } if (score <= 1) { return MembershipPasswordStrength.Weak; } if (score <= 3) { return MembershipPasswordStrength.Medium; } if (score <= 6) { return MembershipPasswordStrength.Strong; } return MembershipPasswordStrength.VeryStrong; } } ``` 这个代码使用`Random`类生成随机数,并使用自定义的`PasswordStrengthChecker`类校验密码强度。你可以按照自己的需要修改密码长度和密码强度校验规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落单枫叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值