RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1078914
Accepted
Zekoyka
Zekoyka
Asked:2020-02-06 03:54:49 +0000 UTC2020-02-06 03:54:49 +0000 UTC 2020-02-06 03:54:49 +0000 UTC

字母和数字依次出现的密码生成器

  • 772
string pass1 = "123456789";
string pass2 = "QWERTYUIOPASDFGHJKLZXCVBNM";

如何从给定的数字和字符生成一定长度的密码?让他们一个接一个,字母>数字。

画出这样的东西:Q2S4F9R3K2J8E1

使用Random rnd = new Random(0);?

c#
  • 5 5 个回答
  • 10 Views

5 个回答

  • Voted
  1. A K
    2020-02-06T04:38:30Z2020-02-06T04:38:30Z

    随机重新排列 pass1 和 pass2 元素(参见此处或此处),然后使用 linq 的 Zip 并借助 .Take所需的字符数进行剪切。

    例如:

    void Main()
    {
        string pass1 = "123456789";
        string pass2 = "QWERTYUIOPASDFGHJKLZXCVBNM";
        this.GenPass(pass1.Shuffle(), pass2.Shuffle(), 10).Dump();
    }
    
    public string GenPass(string pass1, string pass2, int maxChar)
    {
        var result = pass1.Zip(pass2, (x, y) => $"{x}{y}");
        //result.Dump();
        var joined = string.Join("", result).Take(maxChar);
        return new string(joined.ToArray());
    }
    
    public static class Ext1
    {
        public static string Shuffle(this string str)
        {
            char[] array = str.ToCharArray();
            Random rng = new Random();
            int n = array.Length;
            while (n > 1)
            {
                n--;
                int k = rng.Next(n + 1);
                var value = array[k];
                array[k] = array[n];
                array[n] = value;
            }
            return new string(array);
        }
    }
    

    或许有什么需要改进的地方,刚刚解决了“额头上”的问题。

    • 3
  2. user268601
    2020-02-06T04:25:53Z2020-02-06T04:25:53Z

    我写了一个笨拙但简单易懂的解决方案:

      // строки, содержащие нужные символы
      static string numbers = "123456789";
      static string letters = "QWERTYUIOPASDFGHJKLZXCVBNM";
    
      static char generate_random_letter() {
        return letters[rnd.Next(letters.Length)];
      }
    
      static char generate_random_number() {
        return numbers[rnd.Next(numbers.Length)];
      }
    
      public static void Main (string[] args) {
        int password_length = 10;
        string password = "";
    
        for (int i = 0; i < password_length; i++) {
          if (i % 2 == 0) {
            password += generate_random_letter();
          }
          else {
            password += generate_random_number();
          }
        }
    
        Console.WriteLine(password);
      }
    
    • 2
  3. user300864
    2020-02-06T05:21:34Z2020-02-06T05:21:34Z

    下面的示例限制为 18 个字符(可以扩展)。

      static String GetRandomPass(Int32 length) {
        if (length > 18) return null;
    
        Random r = new Random();
        String p = String.Join("",
          Enumerable.Range(65, 26).OrderBy(a => r.Next()).Zip(
            Enumerable.Range(49, 9).OrderBy(b => r.Next()),
            (x, y) => new String(new Char[]{(Char)x, (Char)y})
        ).ToArray());
    
        return p.Substring(0, length);
      }
    
    • 2
  4. Best Answer
    default locale
    2020-02-06T18:11:05Z2020-02-06T18:11:05Z

    我们都知道在这些事情上不需要漂亮、正确和可读的代码。您需要一个 LINQ 单行代码,您可以不经意间将其复制到代码中并立即发送到生产环境。

    实际上,这里是:

    int length = 12;  // длина
    var random = new Random();
    var result = string.Join("",Enumerable.Range(0, length).Select(i => i%2==0 ? (char)('A'+random.Next(26))+"" : random.Next(1, 10)+""));
    

    好吧,或者与解释相同:

    var result = string.Join("",                                // создаем строку
        Enumerable.Range(0, length)                             // из последовательности длины length
                    .Select(i =>                                 
                        i%2==0 ?                                // на четных местах
                            (char)('A'+random.Next(26))+"" :    // генерируем букву
                            random.Next(1, 10)+"")              // на нечетных цифру
                    );
    

    使用Random rnd = new Random(0);?

    Random必须使用,但必须使用空的构造函数。采用数字 ( Random (int Seed)) 的构造函数使用该数字作为初始状态。这Random将始终产生相同的数字序列。

    PSpass1并pass2没有使用它,而是生成英文字母的大写字母和 1 到 9 的数字(顺便说一下,为什么不使用 0?)。

    • 2
  5. Евгений Гущин
    2020-02-11T17:02:04Z2020-02-11T17:02:04Z
        using System;
        using System.Collections.Generic;
        using System.Threading.Tasks;
        using System.Threading;
    
        namespace Rextester
        {    
            public enum PasswordWeakLevel
            {
                NotDefined,
                VeryWeak,
                Weak,
                Sufficient,
                Strength,
                Resistant,
                VeryResistant
            }
    
            public static class PasswordUtils
            {
                private static int MaxRepeatsChar = 2;
    
                public static string GenerateStrongPass(int PassLength = 7, bool UsePunctuation = true, bool UseEntropy = true, int CheckDigits = 0)
                {
                    int checkSum = 0;
                    Random randC = new Random();
                    string result = char.ToString((char)randC.Next(65, 90));
    
                    List<char[]> Intrvs = new List<char[]>();
    
                    char[] charr;
                    if (UsePunctuation)
                    {
                        string specChars = @"!#$%&*+-/=?@\^_|~";   //@"!#$%&()*+-/;<=>?@[\]^_{|}~";
                        charr = specChars.ToCharArray();
    
                        Intrvs.Add(charr);
                    }
    
                    string gl = "AaEeIiOoUu";
                    charr = gl.ToCharArray();
                    Intrvs.Add(charr);
    
                    string sl = "BbCcDdFfGgHhJjKkLMmNnPpQqRrSsTtVvWwXxYyZz";
                    charr = sl.ToCharArray();
                    Intrvs.Add(charr);
    
                    string dl = "189647235";
                    charr = dl.ToCharArray();
                    Intrvs.Add(charr);
    
                    Random randI = new Random();
    
                    while (result.Length < PassLength)
                    {
                        int rndIndex = randI.Next(Intrvs.Count);
                        int charIndex = randC.Next(Intrvs[rndIndex].Length);
    
                        string C = char.ToString(Intrvs[rndIndex][charIndex]);
    
                        if (!result.Contains(C) && (result.Length < 35))
                        {
                            result += C;
                        }
                        else
                        if (!UseEntropy)
                        {
                            result += C;
                        }
                    }
    
                    if (CheckDigits > 0)
                    {
                        int i = 1;
                        int last = 719;
                        foreach (var c in result)
                        {
                            checkSum += (Convert.ToInt32(c) * i) + last;
                            i++;
                            last = Convert.ToInt32(c);
                        }
    
                        string hex = ((checkSum / Convert.ToInt32(result[0])) * 2).ToString("X2") + checkSum.ToString("x2");
                        int checkCounts = hex.Length;
                        result += hex.Substring(hex.Length - CheckDigits, Math.Min(CheckDigits, checkCounts));
                    }
    
                    return result;
                }
    
                public static PasswordWeakLevel TestPasswordWeak(string password, string login)
                {
                    var _res = PasswordWeakLevel.NotDefined;
    
                    if (!IsPasswordLikeLogin(password, login) && !IsQwertyPasswords(password))
                    {
                        if (password.Length > 5)
                        {
                            if (ContainsUpperLetter(password) && ContainsLowerLetter(password)) _res = PasswordWeakLevel.Weak;
                            if (ContainsDigit(password)) _res++;  //Sufficient
    
                            if (RepeatSigns(password)) _res--;
                            if (IsStriping(password)) _res++;  //Strength
    
                            if (ContainsPunctuation(password) && ContainsSeparator(password)) _res++; //Resistant
                            if ((_res == PasswordWeakLevel.Resistant) && (password.Length > 15)) _res++;
                        }
                        else
                            _res = PasswordWeakLevel.VeryWeak;
                    }
                    return _res;
                }
    
                private static bool IsQwertyPasswords(string pass)
                {
                    var keyboardlist = new List<string>();
                    keyboardlist.Add("azer");
                    keyboardlist.Add("qwer");
                    keyboardlist.Add("asdf");
                    keyboardlist.Add("zxcv");
                    keyboardlist.Add("1234");
    
                    foreach (string item in keyboardlist)
                    {
                        if (pass.ToLower().Trim().Contains(item.ToLower()))
                            return true;
                    }
                    return false;
                }
    
                private static bool IsPasswordLikeLogin(string pass, string login)
                {
                    if (login != string.Empty)
                    {
                        if (login.ToLower().Trim().Contains(pass.ToLower().Trim()) || pass.ToLower().Trim().Contains(login.ToLower().Trim()))
                        {
                            return true;
                        }
    
                        string reversed = "";
                        char[] passarr = pass.ToCharArray();
    
                        for (int i = pass.Length - 1; i >= 0; i--)
                        {
                            reversed = reversed + passarr[i];
                        }
    
                        if (reversed.ToLower().Trim().Contains(login.ToLower().Trim()))
                        {
                            return true;
                        }
                    }
    
                    return false;
                }
    
                private static bool RepeatSigns(string pass)
                {
                    char lastchar = (char)0;
                    int _rep = 0;
                    foreach (char c in pass)
                    {
                        if (lastchar == c)
                        {
                            _rep++;
                            if (_rep > MaxRepeatsChar)
                                return true;
                        }
                        lastchar = c;
                    }
                    return false;
                }
    
                private static bool IsStriping(string pass) // фактор перемеживание букв и символов
                {
                    int stripcount = 0;
                    char lastchar = (char)0;
                    foreach (char c in pass)
                    {
                        if ((Char.IsLetterOrDigit(c) && ((Char.IsLetter(c) && Char.IsDigit(lastchar)) || (Char.IsDigit(c) && Char.IsLetter(lastchar)))) ||
                           ((Char.IsLetterOrDigit(c) && !Char.IsLetterOrDigit(lastchar)) || ((Char.IsLetterOrDigit(lastchar) && !Char.IsLetterOrDigit(c)))))
                        {
                            stripcount++;
                            if (stripcount > pass.Length / 3)
                                return true;
                        }
                        lastchar = c;
                    }
                    return false;
                }
    
                private static bool ContainsLowerLetter(string pass)
                {
                    foreach (char c in pass)
                    {
                        if ((Char.IsLetter(c)) && (Char.IsLower(c)))
                            return true;
                    }
                    return false;
                }
    
                private static bool ContainsUpperLetter(string pass)
                {
                    foreach (char c in pass)
                    {
                        if ((Char.IsLetter(c)) && (Char.IsUpper(c)))
                            return true;
                    }
                    return false;
                }
    
                private static bool ContainsDigit(string pass)
                {
                    foreach (char c in pass)
                    {
                        if (Char.IsDigit(c))
                            return true;
                    }
                    return false;
                }
    
                private static bool ContainsPunctuation(string pass)
                {
                    foreach (char c in pass)
                    {
                        if (Char.IsPunctuation(c))
                            return true;
                    }
                    return false;
                }
    
                private static bool ContainsSeparator(string pass)
                {
                    foreach (char c in pass)
                    {
                        if (Char.IsSeparator(c))
                            return true;
                    }
                    return false;
                }
    
                public static bool BadPasswordSecurity(string pass, string Login)
                {
                    return ((int)PasswordUtils.TestPasswordWeak(pass, Login) < 5);
                }
            }
            static class Program
            {
                /// <summary>
                /// The main entry point for the application.
                /// </summary>
                public static void Main(string[] args)
                {
                  for(int i = 0; i< 100; i++)
                  {
                      string pass = PasswordUtils.GenerateStrongPass(11, true, true, 0);
                      Console.WriteLine(pass);
                      Thread.Sleep(100);
                  }
                }
            }
        }
    
    • 0

相关问题

  • 如何知道类中的方法是否属于接口?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5