5 Ocak 2018

C# Bcrypt ile Şifreleme

Database içerisinde şifreleri saklarken düz olarak saklamak yerine şifreleyerek saklamamız bize kullanıcının şifresinin çalınması durumunda şifrenin geriye dönüştürülmesine izin vermeyerek olası izinsiz işlemlerin önüne geçmemize yardımcı olur. Bunların içerisinde en güvenli yöntemlerden birisi olan Bcrypt metodunun nasıl kullanılacağına bir örnek.



using System;
using System.Collections.Generic;
using System.Linq;


//https://www.nuget.org/packages/BCrypt.Net-Next/ paketinden dll kurulacak.


namespace BcryptDemo
{
    class Program
    {
        static List<User> Users { get; set; }

        static void Main(string[] args)
        {
            //Temsili kullanıcı adı ve database
            Users = new List<User>();
            Users.Add(new User
            {
                Username = "user1",
                Password = BCrypt.Net.BCrypt.HashPassword("test1")
            });
            Users.Add(new User
            {
                Username = "user2",
                Password = BCrypt.Net.BCrypt.HashPassword("test2")
            });

            Console.WriteLine("Database kullanıcı adları ve şifreler");

            foreach (var _user in Users)
            {
                Console.WriteLine(_user.ToString());
            }

            Console.Write("Username:");
            var username = Console.ReadLine();

            Console.Write("Password:");
            var password = Console.ReadLine();





            //Temsili database sorgusunu 
            var user = Users.SingleOrDefault(q => q.Username == username);
            var dogrula = false;
            if (user != null)
                dogrula = BCrypt.Net.BCrypt.Verify(password, user.Password);


            Console.WriteLine(dogrula ? "Giriş yapıldı" : "Hatalı kullanıcı adı veya şifre");
            if (dogrula)
            {   //Dikkat edersek aynı kelime için farklı hash kodları alıyoruz.
                //Bu yüzden tahmin edilmesi ve ters çevrilmesi neredeyse imkansız.
                var _password = BCrypt.Net.BCrypt.HashPassword(password);
                Console.WriteLine($"Doğrularken oluşturulan yeni hash kodu eskisinden farklı bu yüzden tahmin edilmesi ve ters çevrilmesi neredeyse imkansız\n {_password}");
            }
        }
    }


    public class User
    {
        public string Username { get; set; }
        public string Password { get; set; }
        public override string ToString()
        {
            return $"Username: {Username}, Password: {Password}";
        }
    }
}


Kaynak
https://github.com/BcryptNet/bcrypt.net