Şifrelerimiz Açık Büfe Olmasın! Şifre Saklamada Başarısız Olma Rehberi: Bunları yapmayın
Veritabanında şifreleri saklamak, en azından güvenli bir şekilde yapmak biraz ustalık gerektirir(di). Günümüzde, güvenlik ihlalleri ve veri sızıntıları büyük çaplı sorunlara neden olabiliyor. Özellikle kullanıcı şifrelerinin güvenli bir şekilde saklanmaması, saldırganların sisteme erişip veritabanındaki hassas bilgilere ulaşmalarını kolaylaştırır. Bu makalede, veritabanında şifrelerin nasıl saklanmaması gerektiği ve yapılan yaygın hataların neden güvenlik riski oluşturduğunu ele alacağız.
Şifre Saklama Konusu iki taraflı bir meseledir. Hem geliştirici hem kullanıcı şifre güvenliği konusunda eşit sorumluluğa sahiptir. Biz burada geliştirici neler yapmamalı onu ele alacağız.
Şifreleri Düz Metin Olarak Saklamak
Düz metinle şifre saklamak tam anlamıyla hacker’lara davetiye çıkarmaktır. Veritabanına şifreleri doğrudan kaydetmek en kötü güvenlik uygulamalarından biridir.
Düz metin(Plain Text) olarak şifre saklamayı düşünüyorsanız, şifre saklamayı düşünmeyin.
Kod Örneği: Kötü Uygulama (Yapmayın)
string password = "password123";
using (SqlConnection conn = new SqlConnection("DbBağlantıCümlesi"))
{
conn.Open();
string query = "INSERT INTO Users (Username, Password) VALUES (@username, @password)";
using (SqlCommand cmd = new SqlCommand(query, conn))
{
cmd.Parameters.AddWithValue("@username", "user1");
cmd.Parameters.AddWithValue("@password", password);
cmd.ExecuteNonQuery();
}
}
CREATE TABLE Users (
UserId INT PRIMARY KEY,
Username NVARCHAR(50),
Password NVARCHAR(50) -- Şifreler düz metin olarak
);
Yukarıdaki şekilde kaydedilmiş şifreler, yazıldığı veritabanına erişimi olan herşeye açık demektir. İçeriden bir çalışan, veritabanına erişim hakkına sahipse, şifrelerin düz metin olarak saklanması büyük bir fırsat olabilir.
- Verilere yasa dışı yollardan ulaşarak şifreleri kötü niyetli kullanabilir.
- Şirket bilgilerini sızdırarak rekabet avantajı sağlayabilir
Zayıf Hash Algoritmaları Kullanmak
MD5 veya SHA-1 kullanarak ‘nostaljik’ takılmak isterseniz, bu sizin için ideal bir hata! MD5, Sudoku çözmek kadar kolay. “Biraz zorlansınlar” demeyin, zorlanmayacaklar.
Kod Örneği: Kötü Uygulama (Yapmayın)
using (MD5 md5 = MD5.Create())
{
byte[] inputBytes = Encoding.UTF8.GetBytes("password123");
byte[] hashBytes = md5.ComputeHash(inputBytes);
string hash = BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
using (SqlConnection conn = new SqlConnection("DBBağlantıCümlesi"))
{
conn.Open();
string query = "INSERT INTO Users (Username, PasswordHash) VALUES (@username, @passwordHash)";
using (SqlCommand cmd = new SqlCommand(query, conn))
{
cmd.Parameters.AddWithValue("@username", "user1");
cmd.Parameters.AddWithValue("@passwordHash", hash);
cmd.ExecuteNonQuery();
}
}
}
Zayıf hash algoritmaları kullanmak, özellikle MD5 ve SHA-1 gibi eskimiş algoritmaların kullanılması durumunda, saldırganlar için ciddi bir güvenlik açığı oluşturur. Bu tür hash’ler günümüzde çeşitli saldırı yöntemleriyle geri döndürülebilir veya çözülebilir.
- Brute-Force Saldırıları: Brute-force, tüm olası şifrelerin tek tek denenerek hash sonucuyla eşleşen şifrenin bulunmasıdır
- Rainbow Table Saldırıları: Rainbow Table, önceden hesaplanmış hash ve karşılık gelen şifre çiftlerini içeren büyük bir veri tabanıdır
- Collision Saldırıları: MD5 ve SHA-1 gibi zayıf hash algoritmaları, aynı hash sonucunu üreten farklı veri girdilerine (collision) karşı savunmasızdır
- Dictionary Saldırıları: Dictionary saldırıları, daha hızlı brute-force saldırılarıdır. Bu yöntem, saldırganın önceden tanımlı şifrelerden oluşan bir liste kullanarak, hash’leri çözmeyi hedefler.
- Online Hash Kırma Araçları: MD5 ve SHA-1 hash’leri için internette birçok çevrimiçi hizmet bulunmaktadır. Bu araçlar, yaygın şifrelerin hash’lerini barındıran devasa veri tabanlarına sahiptir ve saldırganlar bu hizmetleri kullanarak bir hash’in karşılığını birkaç saniyede öğrenebilirler.
Salt(Tuzlama) Kullanmamak
Salt, aynı şifrelerin farklı hash sonuçları üretmesini sağlayan ve güvenliği artıran bir mekanizmadır. Salt kullanılmadığında, aynı şifreye sahip iki farklı kullanıcı için veritabanında aynı hash sonucu oluşur. Bu durum, saldırganların şifreleri çözmesini kolaylaştırır ve rainbow table saldırılarına açık hale getirir.
Kod Örneği: Kötü Uygulama (Yapmayın)
using (SHA256 sha256 = SHA256.Create())
{
byte[] inputBytes = Encoding.UTF8.GetBytes("password123");
byte[] hashBytes = sha256.ComputeHash(inputBytes);
string hash = BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
// kaydedelim
}
Sabit Salt(Tuzlama) Kullanmak
Salt kullanmak doğru bir uygulamadır, ancak her kullanıcı için aynı salt değerini kullanmak yanlış bir yaklaşımdır. Statik salt, tüm kullanıcılar için hash sonuçlarının aynı olmasına neden olur. Bir kullanıcının şifresi kırıldığında, diğer kullanıcıların da şifreleri tehlikeye girebilir.
Kod Örneği: Kötü Uygulama (Yapmayın)
string salt = "heryemeğeaynıtuz"; // Tüm kullanıcılar için aynı tuz
string password = "password123";
string saltedPassword = salt + password;
using (SHA256 sha256 = SHA256.Create())
{
byte[] inputBytes = Encoding.UTF8.GetBytes(saltedPassword);
byte[] hashBytes = sha256.ComputeHash(inputBytes);
string hash = BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
// kaydedelim
}
Salt (tuzlama), bir şifrenin hash’lenmeden önce rastgele bir veri parçasıyla birleştirilmesidir. Bu yöntem, aynı şifreyi kullanan farklı kullanıcıların veritabanında farklı hash sonuçları oluşturmasını sağlar ve rainbow table gibi saldırılara karşı ekstra güvenlik sağlar.
Tuzlama, aynı şifreyi kullanan iki kullanıcının veritabanında farklı hash’ler oluşturmasını sağlar. Bu da saldırganların rainbow table veya benzeri saldırılarla hash’leri çözmesini zorlaştırır. Aynı zamanda tuzlama, şifrelerin brute-force saldırılarına karşı dayanıklılığını artırır.
Veritabanında şifre saklama konusunda yapılan yaygın hataları gördük. Düz metin olarak şifre saklamayın, eski hash algoritmalarını tercih etmeyin ve salt kullanmayı ihmal etmeyin. Ayrıca sabit bir salt yerine her kullanıcıya benzersiz bir salt vererek saldırılara karşı sisteminizi güçlendirin.
Güvenli hash algoritmalarını kullanmak, veritabanınızı daha güçlü hale getirecek ve saldırılara karşı direncinizi artıracaktır.