在密码提示中检查密码

Checking for Password within a password hint

我正在尝试纠正一些代码以防止用户在密码提示中输入他们的密码。我正在考虑防止用户在密码提示中使用密码中的三个连续字符,即使它们被一个字符分隔,即 p-a-s-s-w-o-r-d。

我写了下面的代码,但这可以防止密码提示,例如: password: p123a21312swert1 太严格了。这是因为我从密码提示中删除了所有不在密码中的字符。我四处搜索,但找不到任何相关内容。

var strippedPwdHint = new string(sValue.Where(c => sCompareTo.ToCharArray().Contains(c)).ToArray());

for (var i = 0; i < (strippedPwdHint.Length - 2); i++)
{
    if (!sCompareTo.Contains(strippedPwdHint.Substring(i, 3))) continue;
    retVal = new ValidationResult(ErrorMessage);
    break;
}

在这种情况下,通常是 "how far do I go?" 的情况,因为您不可能涵盖所有情况。最重要的是,对一个人来说显而易见且应该避免的事情可能是如此晦涩难懂,以至于对其他人来说无关紧要。

虽然向前或向后检查提示与密码不匹配很简单,但显然要做更多事情很快就会变得复杂。

假设你有

string password = [Password]
string hint = [Password Hint]

简单地比较密码和提示将标记它们匹配的情况

bool invalid = password.Compare(hint);

要捕获相反的情况,您可以这样做

string reversed = new string(hint.ToCharArray().Reverse().ToArray());
bool invalid = password.Compare(reversed);

如果,正如你所建议的那样,你有这样的东西

string hint = "P-a-s-s-w-o-r-d";

你知道间距字符然后你可以替换它然后比较

bool invalid = password.Compare(hint.Replace("-",""));

但是,如果您不确定空格字符是什么,那就更复杂了,您必须小心不要将合法场景标记为无效。

假设你只想排除提示是密码+常规空格的场景,例如"P-a-s-s-w-o-r-d" 一种方法可能是

  • 找出提示中第一个和第二个密码字符之间的间距
  • 逐步完成这些步骤中的提示,将提示与密码进行比较

其他问题包括

  • 间距字符重要吗?例如,与 P-a-s-s-w-o-r-d 相比,您如何处理 P-a-s-s!w!o!r!d?
  • 你关心多少个间距字符?例如,P 后跟 20 个字符然后 assword 是否有效?

话虽这么说,可能不值得变得太复杂,前后比较提示与密码可能就足够了。