PHP ile güvenli şifreler Hashing(Karıştırma)

Eğer bir web geliştiricisiyseniz, muhtemelen bir kullanıcı hesap sistemi yapmak zorundasınız. Bir kullanıcı hesap sisteminin en önemli yönü, kullanıcı şifrelerinin nasıl korunacağıdır. Kullanıcı hesabı veritabanları sık sık saldırıya uğrar, bu nedenle, web siteniz ihlal edilirse kullanıcılarınızın şifrelerini korumak için kesinlikle bir güvenlik önlemi almanız gerekir. Şifreleri korumanın en iyi yolu, Şifre hgashing(Karıştırma) yöntermidir; Buna tuzlama ifadesi kullanılmaktadır.

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ı facebook, twitter, email gibi diğer servislerdede kullanıldığı için bu hassas veri şifrelenmesi gerekir.

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 sisteminize bir Brute force(kaba kuvvet) saldırısında zorlaştırmış olursunuz.

Brute force nedir?


Brute force saldırısı, siteye giriş için gerekli kullanıcı hesaplarının kilidinin bir nevi 'kaba kuvvet' kullanılarak kırılmaya çalışılması ve tüm bilgilerin çalınmak istenmesi ile bağlantılı, akılda kalıcı bir isme sahipdir. Daha detaylı bir bakış açısıyla brute force nedir?

Eğer zor bir şifreniz varsa ve başka bir kişi sizin şifrenizi sürekli olarak deniyorsa yani doğru parolayı tespit edebilmek için aklına gelen her türlü anahtarı denemeye kalkarsa ne olur? En sonunda sıkılır ve bir süreden sonra denemeyi bırakır. Ancak günümüz gelişen teknolojisi ile brute force yazılımları olarak adlandırdığımız Türkçesi ile "kaba kuvvet" saldırıları nedeniyle artık kötü niyetli kişiler sıkılmadan şifre kırabiliyor.

Peki bu yazılımlar nasıl çalışır? Brute Force yazılımları genel anlamda belli başlı birkaç püf nokta ile çalışırlar. İlk önce şifre girişi yapılacak olan sistemin giriş paneli yazılıma tanıtılır. Genellikle kullanıcı adı ve şifre girişi olur. Yazılıma panel tanıtıldıktan sonra şifre listesinin olduğu bir metin belgesi tanıtılır. Bu metin belgesinin içinde milyonlarca olası şifreler vardır. bulunduğu sistemin işlem hızı ile internet hızına göre değişen deneme hızlarında seri denemelere başlar. Her yanılmada farklı bir parola dener.

Kulanıcılar diğer sitelere giriştede bu şifreleri kullandığı için bu şifreleri hashing(Karıştırma) işleminin önemi artıyor.

En fazla saldırıya uğrayan içerik yönetim sistemi (CMS) yönetim sayfaları şunlardır:


php brute force

Saldırganlar bir web sitesine, kullanıcı hesabına veya başka bir şifrelenmiş bilgiye erişmek istediğinde, öncelikle bu bilgilerin şifresini çözmek veya kilidini açmak için bir şeyler yapmalıdır. Bu süreç, farklı olası şifre kombinasyonlarının denenmesiyle başlar ve erişmek istedikleri yerin şifresini çözene kadar da devam eder.

Brute force yazılımları ortalama zorlukta bir parolayı sadece birkaç günde tespit edebilirler.

Sitenizi Brute force saldırısından korumak için En az 8 karekterli şifre seçin ve şifreler panelden girildiği için içerde şifre karıştırıcı kodların bir önemi kalmıyor sadece şifre denk'mi karşılaştırmasında yavaş olan şifreleme teknikleri kullanın, şifre bulma süresi artacaktır.


Düz metin şifrelerini saklamayın


Şifreler asla düz metin olarak saklanmamalıdır. Örneğin, bir kullanıcı şifresi olarak "12345678" girerse, ASLA "12345678" i veritabanında saklamamalısınız. Bunun yerine, Karıştırma(Tuzlama) parolayı karma kullanmanız gerekecektir.


Kendi şifre karma algoritmanızı oluşturmaya çalışmayın


Siz bir güvenlik uzmanı değilsin. Parola güvenliğinin giriş ve çıkışlarına gelince, çok az şey bildiğiniz gerçeğini kabul edin. Özel olarak oluşturulmuş "şifreleme algoritması" ne kadar benzersiz veya "akıllı" veya görünüşte rastgele göründüğünden bağımsız olarak güvenli olmaz. Kendi özel çözümünüzü oluşturmak yalnızca sisteminizi savunmasız hale getirecektir.

Şifreyi göndermeden evvel en az 6 karakter form'dan girilmesini sağlayalım.


<label>En az Şifrenizi 6 karakter girin</label> <br>

<input type="password" pattern=".{6,}">

Şifreleme fonksiyonları MD5 ve SHA1


Md5() fonksiyonu bir dizgenin MD5 değerini hesaplar.

SHA1() fonksiyonu bir dizgenin SHA1 değerini hesaplar.


<?php

$str = 1234;
echo md5($str);
?>

ÇIKTI:

81dc9bdb52d04dc20036dbd8313ed055

Bu şifreyi google'dan kontrol edelim.


php hashing

Yukardaki resim sizi yanıltmasın md5 ve sha1 şifrelenmiş veriler çözülmezler. Aslında MD5 olsun SHA1 olsun tek yönlü çalışırlar geriye döndürülemezler ve Tek yönlüdürler. Bunun anlamı, özgün sifreye ulaşılamaz ancak karıştırılmış şifreler birbiri ile karşılaştırarak doğruluğu belirlenir. Daha önce oluşturulmuş MD5 ile şifrelenmiş veri, veritabanına kayıt edilir ve aramalarda bu veri bulunarak özgün metine ulaşılır. Ancak bu veritabanları tüm verileri saklayamazlar çünkü buna zaman, güç yetmez. Yani siz karmaşık bir veriyi; mesela "45.*?web_78"" gibi bir veriyi şifrelediğinizde bunu geri döndüremez. Yani zor şifreler geri döndürülemiyor ama kolay şifreler geri döndürülebiliyor.

Md5 ve sha1 gibi karma fonksiyonlarındaki problem, Bu kodlar aşırı hızlı çalışmalarıdır! Bu iyi bir şey değil, çünkü şifrelerinizin "kaba kuvvet" (brute force) saldırısında daha kolay bulunacak. Örneğin: Güçlü bir Bilgisayara sahip biri, saniyede milyarlarca md5 karma oluşturabilir. Sonunda veritabanında depolananla eşleşen bir şifre oluşturmak için kısa bir sürede bulunur.


password_hash ile Şifre Karıştırma


password_hash() , güçlü bir tek yönlü karma algoritması kullanarak yeni bir şifre karma oluşturur. PHP 5.5 ile password_hash fonksiyonu geldi. password_hash şu anda PHP’nin desteklediği güçlü bir algoritmaya sahip BCrypt kütüphanesini kullanıyor. Ama gerektiğinde daha fazla algoritmayı desteklemek için güncellenecektir.

Tuzlama ve karıştırma: PHP'de şifreyi tuzlama ve karıştırma işlemi password_hash() metoduyla yapılır. Bu yöntem üç parametre alır ve bu parolanın son bir karma değerini döndürür.

Sözdizimi:

password_hash($string, $algo, $options)

$string: Bu parametre karma dizenin gelmesini bekler

$algo: Bu parametre, amaç için kullanılacak algoritmayı ifade eden bir tamsayı değeri bekler. Aşağıdaki gibi dört algoritma mevcuttur:

Aşağıdaki algoritmalar şu anda desteklenmektedir:

$options: Bu, tanımlandığı gibi bir dizi gelişmiş seçenek bekleyen isteğe bağlı bir parametredir. Her algoritma için desteklenen seçenekler birbirinden biraz farklıdır. Desteklenen seçenekler aşağıdaki gibidir:

PASSWORD_BCRYPT için desteklenen seçenekler :

PASSWORD_ARGON2I için desteklenen seçenekler :

Desteklenen seçenekler PASSWORD_ARGON2I ve PASSWORD_ARGON2ID:

Dikkat edilecek önemli noktalar :

ÖRNEK:


<?php

$password="test456";

$sifre = password_hash($password, PASSWORD_DEFAULT);

echo $sifre;	

ÇIKTI:

$2y$10$iBwTYUJ1m5ZII4iusky.EuRTHZoIGr68C5ye09Sw9du9caOq238xe

ÖRNEK:


<?php

password="test456";

$sifre = password_hash($password, PASSWORD_DEFAULT,['cost' => 12]);

echo $sifre;	

ÇIKTI:

$2y$12$jyN.SmOVY0wMFxSEBwD2rOYhnKxuQOI8Bg0.DInpauTXySfzpuJq6

Yukardaki cost değerinin varsayılı değeri 10'dur. Siz en az 4 değeri verebilirsiniz; Ne kadar yukarı değer(12, 16) verirseniz şifre oluşturma onun kadar geçikecek ve burute force saldırılarında şifre kırma zamanı etkilenecek.

password_verify()


Şimdi yeni API ile nasıl karma oluşturacağınızı gördükten sonra, bir şifrenin nasıl doğrulandığını görelim. password_verify Bir şifrenin bir karma ile eşleştiğini doğrular.

Sözdizimi:

password_verify ($kullanıcıdangelen , $hashing )

Verilen karma değerin verilen şifre ile eşleştiğini doğrular. Karma belirtilen parola ile eşleşirse true değerini döndürü

ÖRNEK:


<?php

if (password_verify($kullanıcıdangelen, $hashing)) {

    // true yapılacak işler
}

else {

    // false yapılacak işler
}

PASSWORD_ARGON2I PHP 7.2.0'dan itibaren kullanılabilir. PASSWORD_ARGON2ID PHP 7.3.0'dan itibaren kullanılabilmektedir.

ÖRNEK:


<?php

// Varsayılan maliyet faktörleriyle Argon2i
password_hash('password', PASSWORD_ARGON2I);
 
// Özel maliyet faktörleri ile isme göre Argon2i
password_hash('password', PASSWORD_ARGON2I, 
['memory_cost' => 1<<17, 'time_cost' => 4, 'threads' => 2]);
	

Password_hash() fonksiyonu, algoritma olarak PASSWORD_ARGON2I 'yi kabul edecek ve bellek maliyeti, zaman maliyeti ve paralellik derecesini seçenek olarak kabul edecek şekilde değiştirilmiştir.

Lütfen konu haricinde soru sormayın cevaplanmayacaktır. Yorumunuz onaylandıktan sonra yayınlacaktır.

8603

KATEGORİ
  • HTML
  • CSS
  • PHP
  • JQUERY
  • PHOTOSHOP
  • JavaScript
  • Web Dünyası
  • Linux
  • MİTHRİL FRAMEWORK
  • Laravel
POPÜLER MAKALE
  • HTML LİNK(Bağlantı)EKLEME - LİNK VERME
  • HTML YAZI VE RESİM ORTALAMA
  • HTML RESME LİNK VERME
  • HTML DİV ve SPAN NEDİR?
  • HTML FORM OLUŞTURMA
  • HTML KAYAN RESİM VE Marguee KULLANIMI
  • HTML RESİM EKLEME
  • CSS (BOYUT) GENİŞLİK VE YÜKSEKLİK (Width-Height)
  • HTML ARKAPLANA MÜZİK EKLEME
  • PHP ceil()-floor()-round() YUVARLAMA FONKSİYONU
ETİKET
WEBCEBİR © 2013 Tüm hakları saklıdır.