私はセキュリティについてほとんど知らず(基本の基本的な説明を見つける必要があります)、.Netを使用してデータベースにユーザーパスワードを保存するための合理的な方法を考え出そうとしています。
これが私の現在の解決策です:
private static byte[] HashPassword(string password)
{
using (var deriveBytes = new Rfc2898DeriveBytes(password, 10))
{
byte[] salt = deriveBytes.Salt;
byte[] key = deriveBytes.GetBytes(20);
return salt.Concat(key).ToArray(); //Return Salt+Key
}
}
HashPassword()の結果をデータベースに保存します。ユーザーのパスワードを確認するには、次のようにします。
var salt = //1st 10 bytes stored in the DB
var key = //Next 20 bytes stored in the DB
using (var deriveBytes = new Rfc2898DeriveBytes(password, salt))
{
byte[] newKey = deriveBytes.GetBytes(20);
if (newKey.SequenceEqual(key) == false) //Check if keys match
{
return "No Match";
}
else { return "Passwords match"; }
私の質問は、ソルトをランダムにしてこのようにDBに保存する必要があるのか、それとも10バイトのソルトを生成してコードに保存し、常に同じソルトを使用してソルトをDBに保存するのを節約できるのかということです。キーを保存しますか?
また、私がしていることに他の問題があれば、アドバイスをいただければ幸いです。