Geliştiriciler İçin Parolaları Güvenle Saklama Yöntemleri

Teknolojinin bu denli önemli olduğu bir çağda, parolalarımızın güvenliğini sağlamak en önemli ihtiyaçlarımızdan birisidir. Bir web-sitesi, forum, eposta veya oyun şifresi olsun. Servis sağlayıcıların kullanıcılardan istediği şey, parolalarının güvenliğini ve gizliliğini sağlamaları. Peki acaba kendileri bunu sağlayabiliyorlar mı?

Parolalar bilindiği üzere veri-tabanlarında saklanırlar. Fakat veri-tabanları herhangi bir nedenden ötürü kötü amaçlı kişiler tarafından ele geçirildiğinde, kullanıcıların en az düzeyde  zarar görmesi için parolalar veri-tabanında doğrudan, açık bir şekilde saklanmaz. Genellikle parolalar, geliştiriciler tarafından md5 veya sha1 adı verilen, verilerin parmak izlerini oluşturup geri dönüşü olmayacak şekilde bir dizi dönüt oluşturan bazı algoritmalar ile işlendikten sonra saklanır. Bu algoritmaların en büyük özelliği, verdiğiniz verinin boyutu ne kadar büyük olursa olsun size hep aynı karakterde dönüt üretmesidir. Yani 500 karakterlik bir makaleyi de algoritma ile işleseniz, 8 karakterlik bir parolayı da algorita ile işleseniz(hatta 1-2GB boyutundaki bir dosyayı da algoritma ile işleseniz), algoritmanın size ürettiği değer hep aynı olacaktır (bu md5’de 32, sha1’de ise 40 karakterdir).

Bu sayede teoriye göre parolalar geri dönüşü olmayacak bir şekilde şifrelenerek veri-tabanında saklanacak, kullanıcı da sisteme giriş yapmak istediği zaman girdiği değer yine aynı metot ile işlenip veri-tabanındaki değer ile karşılaştırılıp; eşleşme durumunda kullanıcının kimliği doğrulanıp sisteme güvenle giriş yapması sağlanacaktır. Bu nedenledir ki bu servisler üzerindeki parolalarınızı unuttuğunuz zaman sistem size eski parolanızı doğrudan göndermek yerine yeniden üretilmiş bir parola veya kendinize yeni bir parola belirleyebileceğiniz bağlantı göndermektedir. Çünkü aslında servis sizin eski parolanıza sahip değildir. Ama ne yazık ki teoriler, pratikte her zaman düzgün bir şekilde işlemezler..

Bu algoritmalar herkes tarafından bilindiği ve hızlı bir şekilde çalıştığı için rainbow table, yani Türkçe çevirisi ile Gökkuşağı tablosu yoluyla milyonlarca değişik deneme yapılarak tahmin edilebilmekte ve parolaların güvenliği tehlike altına girmektedir.

Bu sebeple geliştiriciler parolaları sadece bu algoritmalardan herhangi birini kullanarak şifrelemek yerine parolalar ile birlikte salt adını verdikleri rastgele karakterlerden oluşan bir veriyi de parola ile birlikte şifreleyerek veri-tabanında saklar. Fakat bu da güvenli değildir. Kaynak kodlarınıza erişebilen kişiler bu veriyi ele geçirip yeni bir gökkuşağı tablosu oluşturabilirler.

Peki güvenliği nasıl sağlayacağız?

  • Parolaları doğrudan, hiçbir işleme tabi tutmadan saklanmamalı.
  • Parolalar sadece md5/sha1 algoritmaları ile işlenerek saklanmamalı.
  • Salt denilen ve parolalar ile birlikte işlenen değerler, servis üzerindeki bütün kullanıcılar için aynı olmamalı. Yani her kullanıcı için ayır bir salt değeri kullanılmalı.
  • Parolaları işlediğiniz algoritmanın yavaş çalışması yararınıza olacaktır. (Algoritma ne kadar yavaş çalışırsa kötü niyetli bir kişinin gökkuşağı tablosu denilen milyonlarca değişik kombinasyon içeren tabloları üretmesi bir o kadar zorlaşacaktır.)
  • Algoritmayı yavaşlatmak için bir parolayı bir kez işlemek yerine 5 veya sunucunuzun gücüne bağlı olarak daha fazla sayıda işleme yapılabilir.
  • Algoritmaları kullanırken geleneksel fonksiyonlar yerine (PHP’de ki md5()/sha1() gibi) daha gelişmiş fonksiyonlar kullanılmalı. (bcrypt veya PHP’nin crypt() fonksiyonu gibi).
  • Ve zorunlu olmasa da kullanıcı sisteme her giriş yaptığında kullanıcının salt değeri değiştirilebilir.
  • Brute-force saldırılarında kullanılan, internet üzerinde çoğunluk tarafından kullanılan ve güvensizliği kanıtlanmış parolaların (12345, parola, password, deneme gibi) kullanımlarını engelleyebilirsiniz. (Bu tür parolaların bir çok listesi internet üzerinde mevcuttur).

Ayrıca Kullanıcılarınız Parolalarını Oluştururken

  • Onlardan güçlü bir parola belirlemelerini isteyin (gerekirse bunu zorunlu kılın).
  • Kısa parolalar, kolay tahmin edilebilecek cinstendir. Gökkuşağı tabloları veya brute-force saldırıları yapılırken önce az sayıda karakter içeren parolaların denemeleri yapılır. Bu sebeple 5 karakterli bir parolanın tahmin edilmesi 8-9 karakter içeren bir parolanın tahmin edilmesinden daha kolaydır. Kullanıcılarınızın seçtiği parolaların en az 8 karakterli olmasını zorunlu kılmanız bu parolaların tahmin edilme olasılığını önemli ölçüde azaltacaktır.
  • Bazı servislerde gördüğümüz gibi (ve tamamen bir saçmalıktan ibaret olan), parolalara karakter limiti getirmeyin. Unutmayın, siz zaten parolayı doğrudan saklamayacak, sadece belirli bir parmak izi saklayacaksınız. Parolanın 8 karakterlik bir kelime olması veya 60 karakterlik bir cümle olması sizin için hiçbir şeyi değiştirmez.
  • Parolalarda özel karakterlerin (@,$/-?* gibi) kullanılmasına izin verin.

Parolaları yukarıdaki açıklamalara uygun şekilde saklamak, sisteminizin güvenliğini iyi bir şekilde arttıracaktır. Yakın zamanda yukarıda verdiğim kurallara uygun bazı PHP kod örneklerini sizinle paylaşacağım. Esen kalın..

 

Kaynaklar

  • https://alias.io/2010/01/store-passwords-safely-with-php-and-mysql/
  • http://bidb.itu.edu.tr/seyirdefteri/blog/2013/09/08/md5-algoritmas%C4%B1

1 Comment

You can post comments in this post.


  • Çok güzel bi çalışma eline sağlık teşekkürler

    İsmail Yeşil 2 sene ago Reply


Post A Reply