我正在尝试使用Dictionary.TryGetValue()
在字典中搜索用户名和密码哈希,如果它匹配,则对用户进行身份验证,如果不匹配,则执行其他操作。
我遇到的问题是,只要哈希值与字典中的不匹配,它就会返回true,可能是因为它与用户名密钥匹配?如果只匹配键而不匹配该值,那么预期行为是否返回true?
我在下面包含了我的方法和用户输出。我打印哈希是为了排除故障。
以下是散列匹配但不匹配的示例用户输出:
如果哈希第一次不匹配,它不会改变行为
密码认证系统
请选择一个选项:
- 建立帐户
- 对用户进行身份验证
- 退出系统
输入选择:1输入您的用户名:用户名
输入密码:用户名,5e884898da28047151d0e56f8dc62927736030d6abbdd62a11ef721d1542d8]
密码认证系统
请选择一个选项:
- 建立帐户
- 对用户进行身份验证
- 退出系统
输入选择:2输入要验证的用户名用户名:用户名
输入密码:5e884898da28047151d0e56f8dc62927736030d6abbdd62a11ef721d1542d85e 884898da2 8047151d0 e56f8Dc62927730030d6abdd62a11ef 721d1542d 8
密码认证系统
请选择一个选项:
- 建立帐户
- 对用户进行身份验证
- 退出系统
输入选择:2输入要验证的用户名用户名:用户名
输入密码:152f66d0fe309590ec40fea1ee037cefb4549a1f511defd16824117a768b1d5e884898da28047151d0e56f8dc62927736030d6abdd62a11ef721d1542d8
成功验证为用户名
以下是身份验证方法
static void authUser(string userName)
{
if (!passDB.ContainsKey(userName))
Console.WriteLine($"Username "{userName}" does not exist.");
else if (passDB.ContainsKey(userName))
{
string secret;
string testHash;
int tryCount = 4;
do
{
secret = HidePassInput();
SHA256 sha256Hash = SHA256.Create();
testHash = GetHash(sha256Hash, secret);
Console.WriteLine(testHash);
if (passDB.TryGetValue(userName, out testHash))
{
Console.WriteLine(testHash);
Console.WriteLine($"Successfully authenticated as {userName}n");
tryCount = 0;
}
else
{
tryCount--;
Console.WriteLine($"Failed to autheticate as {userName}. {tryCount} more tries left.n");
}
} while (tryCount > 0);
}
}
您似乎误解了TryGetValue
方法的使用。
第一个参数是要获取其值的键。第二个参数是out
参数。如果键存在,它的值将被分配给您用作out
参数参数的变量。testHash
所保持的任何值都被覆盖。
TryGetValue
没有收到您要查找的值。它只接收一个密钥。如果找到该键,则返回true,否则返回false。找到的关键字的值被分配给out
变量。