Kategoriler
C# Programlama

Şifre Depolama(Password Storage)

Veri tabanında şifre depolarken farklı yaklaşımlar kullanılmaktadır. Bu yazımda biraz bunlara değineceğim.

Hash Kullanmak

salt

Avantajları;

  • Şifre veri tabanında depolanmaz.
  • Şifre uzunluğu tahmin edilemez.

Dezavantajları;

  • Şifre geri dönüştürülemediği için kullanıcı şifresini unutursa yeniden şifre yaratmak gerekir.
  • Farklı iki kullanıcı aynı şifreyi kullanırsa aynı değer üretilir. Bunu aşmak için salt kullanmak gerekir.
  • MD5 gibi algoritmalar kullanılırsa, brute force atakları ile şifre bulunabilir.

 

public class StorePassword
    {
        public static byte[] HashPasswordWithSalt(byte[] toBeHashed, byte[] salt)
        {
            using (var sha256 = SHA256.Create())
            {
                return sha256.ComputeHash(Combine(toBeHashed, salt));
            }
        }
        private static byte[] Combine(byte[] first, byte[] second)
        {
            var ret = new byte[first.Length + second.Length];
            Buffer.BlockCopy(first, 0, ret, 0, first.Length);
            Buffer.BlockCopy(second, 0, ret, first.Length, second.Length);
            return ret;
        }
        public static byte[] GenerateSalt()
        {
            const int SALT_LENGTH = 32;
            using (var randomNumberGenerator = new RNGCryptoServiceProvider())
            {
                var randomNumber = new byte[SALT_LENGTH];
                randomNumberGenerator.GetBytes(randomNumber);
                return randomNumber;
            }

        }
    }
static void Main(string[] args)
        {
            #region testStorePassword
            string password = "erkanliman.com";
            byte[] salt = StorePassword.GenerateSalt();

            var passwordHash = StorePassword.HashPasswordWithSalt(Encoding.UTF8.GetBytes(password), salt);

            Console.WriteLine("Şifre: " + password);
            Console.WriteLine("salt: " + Convert.ToBase64String(salt));
            Console.WriteLine("Hashli Şifre: " + Convert.ToBase64String(passwordHash));

            #endregion
        }

Çıktı:

saltResult

 

Şifre Bazlı Key Üretme

public class passwordBasedKey
    {
        public static byte[] GenerateSalt()
        {
            using (var randomNumbers = new RNGCryptoServiceProvider())
            {
                var randomNumber = new byte[32]; randomNumbers.GetBytes(randomNumber);
                return randomNumber;
            }
        }
        public static byte[] HashPassword(byte[] toBeHashed, byte[] salt, int numberOfRounds)
        {
            using (var rfc2898 = new Rfc2898DeriveBytes(toBeHashed, salt, numberOfRounds))
            {
                return rfc2898.GetBytes(32);
            }
        }

    }
private static void HashPassword(string passwordToHash, int numberOfRounds)
        {
            var sw = new Stopwatch();
            sw.Start(); var hashedPassword = passwordBasedKey.HashPassword(Encoding.UTF8.GetBytes(passwordToHash), passwordBasedKey.GenerateSalt(), numberOfRounds);
            sw.Stop();
            Console.WriteLine();
            Console.WriteLine("Şifre : " + passwordToHash);
            Console.WriteLine("Hashli Şifre : " + Convert.ToBase64String(hashedPassword));
            Console.WriteLine("İterasyon <" + numberOfRounds + "> Zaman : " + sw.ElapsedMilliseconds + "ms");
        }
static void Main(string[] args)
        {
            #region testpasswordBasedKey
            var passwordToHash = "erkanliman.com";
            
            HashPassword(passwordToHash, 100);
            HashPassword(passwordToHash, 1000);
            HashPassword(passwordToHash, 10000);
            HashPassword(passwordToHash, 100000);
            HashPassword(passwordToHash, 1000000);
            HashPassword(passwordToHash, 10000000);
            #endregion

        }

Çıktı:

pwResult

Adsız

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.