【问题标题】:Find charaters in string for checking password complexity c#在字符串中查找字符以检查密码复杂性c#
【发布时间】:2015-02-18 08:46:02
【问题描述】:

我试图用这种方式进行密码复杂性测试,但它不起作用。

 private void button1_Click(object sender, EventArgs e)
        {
            string CapsChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            string LowerChars = "abcdefghijklmnopqrstuvwxyz";
            string Digits = "0123456789";
            string SpecialChars = "#<>!~@";

            if (textBox1.Text.ContainsInvariant(CapsChars))
            {
                if (textBox1.Text.ContainsInvariant(LowerChars))
                {
                    if (textBox1.Text.ContainsInvariant(Digits))
                    {
                        if (textBox1.Text.ContainsInvariant(SpecialChars))
                        {
                            MessageBox.Show("ALL Ok");
                        }
                        else
                        {
                            MessageBox.Show("No special character found");
                        }
                    }
                    else
                    {
                        MessageBox.Show("No digit found");
                    }
                }
                else
                {
                    MessageBox.Show("No lower case character found");
                }
            }
            else
            {
                MessageBox.Show("No upper case character found");
            }

        }

public static class StringExt
    {
        public static bool ContainsInvariant(this string sourceString, string filter)
        {
            return sourceString.ToLowerInvariant().Contains(filter);
        }
    }

我喜欢这样测试,密码必须有一个大写字符和一个小写字符,一个数字和一个特殊字符,密码长度必须大于 8。寻找如何实现它的建议。只是想知道我们可以使用 LINQ 实现相同的目标吗?谢谢

【问题讨论】:

  • Regex 对于您正在尝试做的事情恕我直言,这将是一个更好的选择。请参阅此处的 C# 示例,该示例与您要实现的目标相似(但不完全相同),并且可以进行修改以满足您的确切需求:stackoverflow.com/questions/3131025/strong-password-regex
  • @kha 正则表达式仍然依赖于英语。我对 [a-zA-Z] 有点紧张
  • 有一些研究表明,像这样的密码复杂性实际上会降低安全性。普遍的智慧建议向用户询问密码短语而不是密码是更好的选择。

标签: c#


【解决方案1】:

不确定这是最好的变体。只是比你的简单一点:

using System;
using System.Linq;

namespace PasswordCheck
{
    class Program
    {
        static void Main(string[] args)
        {
            CheckPasswordComplexity("abc");
            CheckPasswordComplexity("aB1#");
            CheckPasswordComplexity("ABCc");
        }

        static private void CheckPasswordComplexity(string text)
        {
            var hasUpperCase = text.Any(char.IsUpper);
            var hasLowerCase = text.Any(char.IsLower);
            var hasDigits = text.Any(char.IsDigit);
            var hasPuncutation = text.Any(char.IsPunctuation); // Convers more than your case. Check here: http://www.dotnetperls.com/char-ispunctuation

            if (!hasUpperCase)
            {
                Console.WriteLine("No upper case character found");
            }
            else if (!hasLowerCase)
            {
                Console.WriteLine("No lower case character found");
            }
            else if (!hasDigits)
            {
                Console.WriteLine("No digit found");
            }
            else if (!hasPuncutation)
            {
                Console.WriteLine("No special character found");
            }
            else
            {
                Console.WriteLine("ALL Ok");
            }
        }
    }

【讨论】:

  • 这要好得多,因为它适用于任何语言。
【解决方案2】:

我想你需要重写 ContainsInvariant 方法

public static class StringExt
{
    public static bool ContainsInvariant(this string sourceString, string filter)
    {
        return sourceString.Any(c=>filter.Contains(c));
    }
}

以前的变体return sourceString.ToLowerInvariant().Contains(filter) 忽略大写字母并搜索完整的字符串匹配,而不是单个字母匹配

您需要在类代码之前添加using System.Linq; 才能使用方法 Any()

【讨论】:

    猜你喜欢
    • 2013-07-04
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2020-07-31
    • 2016-01-31
    • 1970-01-01
    相关资源
    最近更新 更多