Dictionary.TryGetValue()
ユーザー名とパスワードのハッシュの辞書を検索するために使用しようとしています。一致する場合はユーザーを認証し、そうでない場合は何か他のことを行います。
私が抱えている問題は、ハッシュ値が辞書の内容と一致しない場合はいつでも、おそらくユーザー名キーと一致したため、とにかく true を返すことです? キーのみが一致し、その値が一致しない場合に true を返す動作は予想されますか?
メソッドとユーザー出力を以下に示します。トラブルシューティングの目的でハッシュを出力しています。
ハッシュが一致し、その後一致しないユーザー出力の例を次に示します。
ハッシュが最初に一致しない場合、動作は変わりません
パスワード認証システム
1 つのオプションを選択してください:
- アカウントを開設する
- ユーザーを認証する
- システムを終了する
選択を入力してください: 1 ユーザー名を入力してください: ユーザー名
パスワードを入力してください: ユーザー名、5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8]
パスワード認証システム
1 つのオプションを選択してください:
- アカウントを開設する
- ユーザーを認証する
- システムを終了する
Enter selection: 2 認証したいユーザー名を入力 Username: ユーザー名
パスワードを入力し てください: 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8
パスワード認証システム
1 つのオプションを選択してください:
- アカウントを開設する
- ユーザーを認証する
- システムを終了する
Enter selection: 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);
}
}