SSS
PHP Manual

Güvenli Parola Karıştırma

Bu bölümde, parolaları güvenlik altına alma da kullanılan karıştırma (hashing) işlevinin arka planını ve etkin bir şekilde nasıl uygulayabileceğimizi ele alacağız.

  1. Kullanıcıların girmiş olduğu parolaları neden karıştırmalıyım?
  2. MD5 ve SHA1 gibi genel karıştırma işlevlerini parolalar için kullanmak neden uygun değildir?
  3. Genel karıştırma teknikleri kullanışlı olmadıklarına göre, parolalarımı nasıl karıştırmalıyım?
  4. Tuzlama nedir?
  5. Tuzlarımı nasıl saklarım?
Kullanıcıların girmiş olduğu parolaları neden karıştırmalıyım?

Parola karıştırma, kullanıcıların parola girerek kullandıkları bir uygulamanın tasarımında, mutlaka göz önüne alınması gereken en temel güvenlik faktörlerinden birisidir. Parola karıştırma tekniği kullanılmadığı takdirde, uygulamanızın veri tabanında saklanan her türlü parola veritabanınızı ele geçirenler tarafından çalınabilir ve ardından sadece uygulamanız değil uygulamanızı kullanan kullanıcılar aynı parolayı başka servisler için de kullanıyorlarsa risk altında kalırlar.

Kullanıcılarınızın parolalarını veri tabanına kaydetmeden önce, uygulayacağınız karıştırma algoritması ile saldırganın özgün parolayı tahminini imkansız kılarken, ilerleyen süreçte de özgün parolayı bulma çabalarını da (kaba kuvvet saldırısı tekniğiyle) zorlaştırmış olursunuz.

Ancak, dikkat edilmesi gereken önemli nokta, parola karıştırma sadece veri kaynağınızın ele geçirilmesine karşı koruma sağlarken, uygulamanıza isteminiz dışında yerleştirilmiş zararlı kodlar aracılığıyla şifreleri ele geçirmede koruma sağlamaz.

MD5() ve SHA1() gibi genel karıştırma işlevlerini parolalar için kullanmak neden uygun değildir?

MD5, SHA1 ve SHA256 gibi karıştırma algoritmaları verimli ve çok hızlı olmaları için tasarlanmıştır. Modern teknikler ve bilgisayar ekipmanları ile, Kaba kuvvet (brute force) atak tekniği kullanarak özgün değere ulaşma sıradan bir hale gelmiştir.

Çünkü, modern bir bilgisayar, oldukça hızlı olarak bu karıştırma tekniklerini tersine çevirir, çoğu güvenlik uzmanı da bunların parola karıştırma da kullanımına karşı aleyhte tavsiye de bulunur.

Genel karıştırma teknikleri kullanışlı olmadıklarına göre, parolalarımı nasıl karıştırmalıyım?

Parolaları karıştırmada, dikkate alınması gereken iki husus vardır; hesaplamanın maliyeti ve tuzlama. Karıştırma algoritmasında daha fazla hesaplama maliyeti demek kaba kuvvet ataklarının daha fazla zaman gerektirmesi demektir.

PHP 5.5, güvenli bir şekilde karıştırma ve parola doğrulamayı birlikte güvenle sağlayan bir yerel parola karıştıma APIsi sağlamaktadır. Ayrıca PHP 5.3.7 sürümünden itibaren kullanılabilen » saf bir PHP uyumluluk kütüphanesi de vardır.

Diğer bir seçenek PHP 5.3 sürümünden itibaren çeşitli karıştırma algoritmalarını destekleyen crypt() işlevidir. Bu işlevi kullanırken, PHP, desteklenen her bir algoritmayı kendi bünyesinde barındırdığı için, algoritmalardan bir veya bir kaçı sisteminizde bulunmasa da seçtiğiniz algoritmanın varlığını ve kullanımını garanti eder.

Diğer karıştırma işlevi ise crypt() işlevinden daha fazla algoritmayı ve seçeneği destekleyen fakat crypt() işlevinin desteklediği bazı algoritmaları desteklemeyen hash() işlevidir. Hash eklentisi PHP ile birlikte gelir fakat derleme anında kullanıcı dilerse gözardı edebilir dolayısıyla crypt() işlevinde olduğu gibi algoritmaların varlığını garanti etmez.

Parola karıştırma da tavsiyemiz Blowfish algoritmasını kullanmanızdır, parola karıştırma APIsi tarafından da öntanımlı olarak kullanılan bu algoritma MD5 veya SHA1 den daha fazla hesaplama gerektirmesine rağmen hala ölçeklenebilir durumdadır.

Bir parolayı doğrulamak için crypt() kullanıyorsanız, bir sabit zaman dizgesi karşılaştırması kullanarak zamanlama saldılarını engellemeyi düşünmeniz gerekir. Ne PHP'nin == ve === işleçleri ne de strcmp() işlevi sabit zaman dizgesi karşılaştırması yapar. password_verify() bunu sizin için yapacak gibi görünse de mümkün oldğunca yerel parola karıştıma APIsini kullanmanızı şiddetle öneririz.

Tuzlama nedir?

Bir şifreleme tuzu, gökkuşağı tablosu olarak bilinen, daha önceden hesaplanarak oluşturulmuş karıştırma listesinden karşılaştırma yaparak eşleştirme ihtimalini ortadan kaldırmak için, karıştırma işlemi esnasında uygulanan bir değerdir.

Basit anlamda tuz, karıştırılmış değerinizi kırma teşebbüslerini zorlaştırmada kullanılan ek bir veridir. İnternet üzerinde, daha önceden hesaplanmış kapsamlı karıştırma değerlerinin yanı sıra özgün değerleri de barındıran bir dizi liste hizmeti vardır. Tuz kullanmak bu listelerden karıştırma değerini bulmayı mantıksız veya imkansız kılar.

Bir tane sağlanmamışsa password_hash() rasgele bir tuz oluşturacaktır ve bu genelde en kolay ve en güvenilir yaklaşımdır.

Tuzlarımı nasıl saklarım?

password_hash() veya crypt() işlevini kullanırken, dönen değer üretilen karıştırılmış parola olup tuzu da içerir. Parolaları doğrularken password_verify() veya crypt() işlevine doğrudan verilebilecek şekilde karıştırma bilgisini içeren bu değer veritabanınızda hiç değiştirlmeden harfi harfine saklanmalıdır.

Aşağıdaki şekil, crypt() veya password_hash() işlevinden dönen değerin biçimini gösterir. Görebileceğiniz gibi, ileriki bir parola doğrulaması için gereken tuzu ve algoritma ile ilgili tüm bilgiyi içinde barındırmaktadır.


        password_hash veya crypt işlevinden dönen değerin bileşenleri:
        sırasıyla, seçilen algoritma, algoritmanın seçenekleri, kullanılan tuz
        ve karıştırlmış parola.


SSS
PHP Manual