问题描述
我正在尝试使用Dictionary.TryGetValue()
在字典中搜索用户名和密码哈希,如果匹配则对用户进行身份验证,如果不执行其他操作。
我遇到的问题是,只要哈希值与字典中的值不匹配,它就始终返回true,也许是因为它与用户名键匹配? 如果只有键而不是那个值匹配,是否期望行为返回true?
我在下面包括了我的方法和用户输出。我正在打印哈希以进行故障排除。
以下是示例用户输出,其中哈希匹配,然后不匹配:
如果哈希第一次不匹配,则不会更改行为
密码验证系统
请选择一个选项:
输入密码: 用户名,5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8]
密码验证系统
请选择一个选项:
输入选择:2 输入您要验证的用户名 用户名:username
输入密码: 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 成功验证为用户名
密码验证系统
请选择一个选项:
输入选择:2 输入您要验证的用户名 用户名:username
输入密码: 152f66d0fe3a409590ec40fea1ee037cefb4549a1f511defd16824117a768b1d 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8
已成功验证为用户名
下面是身份验证方法
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
变量。