Şifreleriniz genellikle düz metin biçiminde tutulmaz. Hesabınıza giriş yaptığınızda, şifre tek yönlü bir karma algoritma üzerinden çalışır. Bu şekilde tanınmaz, tamamen farklı bir karakter dizisine dönüşür. Bu dize daha sonra veritabanındaki diğer karmalarla karşılaştırılır ve eşleşirlerse hesaba erişirsiniz.
Parolaları saklamanın güvenli bir yolu gibi görünse de, bir sorun var. İki parola aynıysa, hash’leri aynıdır ve bu da kırılmasını kolaylaştırır. Şifre korumanın devreye girdiği yer burasıdır. Şifre tuzu, karma algoritmadan geçmeden önce şifreye eklenen rastgele bir veri parçasıdır.
Parolanızın “sarı” olduğunu hayal edin. Başka bir kullanıcı aynı parolaya sahipse, hash çıktısı aynı olacaktır. Ancak her ikisine de rastgele birkaç karakter eklerseniz, tamamen farklı karmalara sahip iki farklı şifre alırsınız — ‘yellow#1Gn%’ ve ‘yellow9j?L’ — gibi farklı hashler olabilir.
hashing("merhaba") = C39436EE452E641CDE2EB992AB397911
hashing("merhaba" + "e$7H3$YVYJpeyjAO") = A89A880CF2CB460B689DDF6F2F09EF5C
hashing("merhaba" + "2!yt*hrBwoK4Avvh") = 82A2A1BA55B1538C22E3D133D4DFB5FC
Bu yapılan yöntem ile şifrenin uzunluğu ve karmaşıklığı artmış olur. Tuz (salt) değeri bulunsa bile her kullanıcı için ayrı bir rainbow tablosu üretilmesi gerekir ve bir seferde tek bir kullanıcının şifresi sorgulanabilir. Saldırılardan korunmak için tuz (salt) değerinin her kullanıcıda farklı olması ve hashlenip saklanması önerilir. Kısa tuz (salt) değerlerinin kullanılması saldırganlar tarafından tuz (salt) değerinin tahmin edilmesini kolaylaştırır. Kullanıcı adının tuz (salt) değeri olarak kullanmaması gerekir. Tuz (salt) değerlerini oluşturmak için kriptografik hash algoritmaları kullanılmalıdır. Bu algoritmalar tuz (salt) değerinin tahmin edilmesini zorlaştırır. Çeşitli programlama dillerinde bu değerleri üreten nesneler vardır. Örneğin;
Php -> mcrypt_create_iv, openssl_random_pseudo_bytes
Java ->java.security.SecureRandom
.NET -> System.Security.Cryptography.RNGCryptoServiceProvider
Ruby -> SecureRandom
Python -> os.urandom
Bu yazıda bahsedilen yöntemlerin dışında daha başka ve güvenli yöntemler de var. Sistem güvenliği sadece şifre güvenliği ile bitmiyor. Web uygulamalarındaki güvenlik açıklarını öğrenmek için OWASP sitesini ziyaret etmenizi öneririm. En iyi geliştiriciler bile hata yapabilir. Dolayısıyla alınan önlemleri üst düzeyde tuttuktan sonra sistemi penetrasyon testine sokmak ve güvenlik uzmanlarından destek almak gerekebilir.