【问题标题】:Numbers only password strength [closed]仅数字密码强度[关闭]
【发布时间】:2016-02-26 13:04:28
【问题描述】:

在我的组织中,用户必须仅从数字生成密码(键盘用于访问),最小长度为 8 个数字。如何确保用户生成的密码不会太弱(在服务器处理密码更改请求上使用 c#),应用以下规则:

  • 后面的 3 个数字(甚至是密码的一部分)不连续或不重复(9451238401 或 543555784)

【问题讨论】:

  • 你这边有什么尝试吗?
  • 这真的是一个编程问题吗?似乎这与编写实际程序无关。
  • @roryap:对我来说,这似乎是一个完全合理的问题:给定一个候选密码,它是否违反了顺序/重复规则?缺乏努力是另一回事,但这绝对是一个编程问题。
  • 这是至少两个现有问题的副本,因此过于宽泛。尝试以更小的步骤分解您的问题,尝试自己解决每个步骤,如果您无法解决,请按步骤提出问题。一旦您将所有较小的部分组装成一个,但仍然无法弄清楚,请展示您的代码,阅读How to Ask 并明确说明您正在寻找什么。
  • 重新打开,因为当它们不重复时,我不应该关闭重复的问题。对不起。

标签: c# .net regex security passwords


【解决方案1】:

正则表达式为:

^((?!(?<ch>.)\k<ch>\k<ch>)(?!012|123|234|345|456|567|678|789|890)[0-9]){8,}$

(?!(?&lt;ch&gt;.)\k&lt;ch&gt;\k&lt;ch&gt;) 将检查重复三次的相同字符。请注意,对于各种连续序列,我必须将它们放在可能的序列列表中,(?!012|123|234|345|456|567|678|789|890)[0-9] 是被接受为有效的字符。 {8,} 是最小长度。

【讨论】:

  • 为创意点赞。
【解决方案2】:

如果您想要一种通用方法来告诉您重复、升序和降序数字的数量:

static void checkStrength(string text, out int maxRepeats, out int maxAscending, out int maxDescending)
{ 
    maxRepeats     = 0;
    maxAscending   = 0;
    maxDescending  = 0;

    int currRepeats    = 0;
    int currAscending  = 0;
    int currDescending = 0;

    for (int i = 1; i < text.Length; ++i)
    {
        char curr = text[i];
        char prev = text[i-1];

        if (curr - prev == -1)
            maxDescending = Math.Max(maxDescending, ++currDescending);
        else
            currDescending = 1;

        if (curr - prev == 1)
            maxAscending = Math.Max(maxAscending, ++currAscending);
        else
            currAscending = 1;

        if (curr == prev)
            maxRepeats = Math.Max(maxRepeats, ++currRepeats);
        else
            currRepeats = 1;
    }
}

你必须调用它,然后对结果做你想做的事:

int maxRepeats, maxAscending, maxDescending;
checkStrength(text, out maxRepeats, out maxAscending, out maxDescending);

if (maxRepeats > REPEAT_LIMIT || maxAscending > ASCENDING_LIMIT || maxDescending > DESCENDING_LIMIT)
{
    // ... report error or whatever
}

如果您不需要更改允许的重复数字或升序数字,那么 xanatos 的正则表达式显然是迄今为止最短的代码。仅当您需要在运行时更改允许的计数时才需要此代码。

【讨论】:

    猜你喜欢
    • 2011-08-26
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2012-05-31
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多