私はC#を初めて使用しますが、これがここでの最初の質問です。そのため、偽物について事前に謝罪します。
コンテクスト:
ユーザーが登録したら、CreateSaltedHash()メソッドを呼び出し、ユーザーが入力したパスワードをテキストフィールドから渡します。このメソッドは、パスワードをユーザーテーブルの[パスワード]列に保存する前に、パスワードをソルトおよびハッシュします。
質問:
ユーザーがログインしようとしたときにパスワードを検証するにはどうすればよいですか?
CreateSaltedHash()メソッドを再度呼び出すと、ランダムなソルトのために一致しません。
塩を別のカラムに保管する必要がありますか?ソルトハッシュを生成するときに区切り文字を使用する必要がありますか?ソルトおよびハッシュされたパスワードに対して入力パスワードを検証する最も安全な方法は何ですか?
コード: これは私がこれまでに持っているものです。
public class PasswordHash
{
public const int SALT_BYTES = 32;
/*
* Method to create a salted hash
*/
public static byte[] CreateSaltedHash(string password)
{
RNGCryptoServiceProvider randromNumberGenerator = new RNGCryptoServiceProvider();
byte[] salt = new byte[SALT_BYTES];
randromNumberGenerator.GetBytes(salt);
HashAlgorithm hashAlgorithm = new SHA256Managed();
byte[] passwordByteArray = Encoding.UTF8.GetBytes(password);
byte[] passwordAndSalt = new byte[passwordByteArray.Length + SALT_BYTES];
for (int i = 0; i < passwordByteArray.Length; i++)
{
passwordAndSalt[i] = passwordByteArray[i];
}
for (int i = 0; i < salt.Length; i++)
{
passwordAndSalt[passwordByteArray.Length + i] = salt[i];
}
return hashAlgorithm.ComputeHash(passwordAndSalt);
}
public static bool OkPassword(string password)
{
//This is where I want to validate the password before logging in.
}
}
Registerクラスのメソッドを呼び出します。
User user= new User();
user.password = PasswordHash.CreateSaltedHash(TextBoxUserPassword.Text);