Bu ornegi veritabaniniza uyarlayabilirsiniz (bir password, bir de salt sutunu olacak, ikisi de text, kullanıcı adları unique olmalı):
// Veritabanindaki kullanicilar
List<Person> people = new List<Person>();
void Main()
{
InitDb();
// Login test
TestLogin("Person #5", "password5");
TestLogin("Person #5", "passwordx");
}
private void InitDb()
{
for (int i = 0; i < 10; i++)
{
var p = new Person();
p.Id = i;
p.Name = $"Person #{i}";
var pwd = CreatePwdHash($"password{i}");
p.Password = pwd.PasswordHash;
p.Salt = pwd.PasswordSalt;
people.Add(p);
}
}
private void TestLogin(string userName, string password)
{
var u = ValidateLogin(userName, password);
if (u == null)
{
Console.WriteLine("Login basarisiz.");
}
else
{
Console.WriteLine("Login basarili");
Console.WriteLine($"{u.Id}, {u.Name}");
}
}
private MyPassword CreatePwdHash( string password, string saltValue = "" )
{
byte[] salt = new byte[6];
if( string.IsNullOrEmpty(saltValue) )
{
RandomNumberGenerator.Create().GetBytes(salt);
}
else
{
Convert.FromBase64String(saltValue).CopyTo(salt,0);
}
var pwdHash = MD5
.Create()
.ComputeHash( Encoding.Unicode.GetBytes( BitConverter.ToString( salt ) + password ) );
var pwd = new MyPassword() {
PasswordHash = Convert.ToBase64String( pwdHash ),
PasswordSalt = Convert.ToBase64String( salt )
};
return pwd;
}
private Person ValidateLogin(string userName, string password)
{
bool isValid = false;
var user = people.SingleOrDefault(p => p.Name == userName);
if (user != null)
{
var pwd = CreatePwdHash(password, user.Salt);
if (pwd.PasswordHash == user.Password)
{
isValid = true;
}
}
return isValid ? user : null;
}
public class MyPassword
{
public string PasswordHash { get; set; }
public string PasswordSalt { get; set; }
}
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string Password { get; set; }
public string Salt { get; set; }
}
How to create a Minimal, Reproducible Example
The way to Go.
World's most advanced open source (object-) relational
Database.
Flutter (for mobile, for web & desktop.