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:
- WordPress wp-admin veya wp-login.php giriş sayfaları
- Magento /index.php veya admin sayfaları
- Joomla! yöneticisi
- vBulletin admin kontrol paneli
- ve çeşitli web sitelerinin diğer genel giriş sayfaları
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:
Bu şifreyi google'dan kontrol edelim.
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:
$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:
- PASSWORD_DEFAULT BCrypt algoritmasını kullanın (PHP 5.5.0'dan itibaren varsayılan). PHP'ye yeni ve daha güçlü algoritmalar eklendikçe, bu sabitin zaman içinde değişmek üzere tasarlandığını unutmayın. Bu nedenle, bu tanımlayıcıyı kullanmanın sonucunun uzunluğu zamanla değişebilir. Bu nedenle, sonucun 60 karakterden daha genişleyebilecek bir veritabanı sütununda saklanması önerilir (255 karakter iyi bir seçimdir).
- PASSWORD_BCRYPT CRYPT_BLOWFISH Karma oluşturmak için algoritmayı kullanın . Bu , "$ 2y $" tanımlayıcısını kullanarak standart bir
crypt()
uyumlu karma üretecektir . Sonuç daima 60 karakterli bir dize olacak, başarısızlık halinde FALSE döner. - PASSWORD_ARGON2I Karma oluşturmak için Argon2i karma algoritmasını kullanın. Bu algoritma sadece PHP Argon2 desteğiyle derlenmişse kullanılabilir.
- PASSWORD_ARGON2ID Karma oluşturmak için Argon2id karma algoritmasını kullanın. Bu algoritma sadece PHP Argon2 desteğiyle derlenmişse kullanılabilir.
$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 :
- Maliyet: Uygulanacak Maksimum Algoritmik Maliyet. Varsayılan değer 10'dur. Algoritmik maliyet, yükleme süresini doğrudan etkiler ve önemli ölçüde çalışan donanıma bağlıdır.
- Tuz: Geliştiriciler aynı zamanda manuel tuzlar da sağlayabilir, ancak tavsiye edilmez.
PASSWORD_ARGON2I için desteklenen seçenekler :
- Hafıza maliyeti: Karma oluşturmak için uygulanacak Maksimum Bellek Maliyeti.
- Zaman maliyeti: Karma değeri hesaplamak için alınması gereken Maksimum Süre.
- Konular: Kullanılacak iş parçacığı.
Desteklenen seçenekler PASSWORD_ARGON2I ve PASSWORD_ARGON2ID:
- memory_cost( integer ) Argon2 karma değerini hesaplamak için kullanılabilecek maksimum bellek (byte cinsinden). Varsayılan olarak PASSWORD_ARGON2_DEFAULT_MEMORY_COST
- time_cost ( integer ) Argon2 karma değerini hesaplamak için harcayabileceğiniz maksimum süre. Varsayılan olarak PASSWORD_ARGON2_DEFAULT_TIME_COST
- thread "iş parcacığı" ( integer ) Argon2 karma değerini hesaplamak için kullanılacak thread sayısı. Varsayılan olarak PASSWORD_ARGON2_DEFAULT_THREADS.
Dikkat edilecek önemli noktalar :
- Bir karma algoritması tercihen tek yönlü bir yol olmalıdır, yani bir şifre çözme yöntemi bulunmamalıdır, bu kavram izlendikten sonra, açıklanan fonksiyonların şifre çözme yöntemi yoktur.
- Herhangi bir şifre çözme yöntemine sahip olmamak, şifrenin doğrulanması, kullanıcı tarafından oturum açma sırasında sağlanan her girişi şifrelemeyi gerektirecektir, bu nedenle PHP, aynı doğrulamak için
password_verify()
fonksiyonu sağlar.
ÖRNEK:
<?php
$password="test456";
$sifre = password_hash($password, PASSWORD_DEFAULT);
echo $sifre;
ÇIKTI:
ÖRNEK:
<?php
password="test456";
$sifre = password_hash($password, PASSWORD_DEFAULT,['cost' => 12]);
echo $sifre;
ÇIKTI:
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
}
Ö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.
- HTML
- CSS
- PHP
- JQUERY
- PHOTOSHOP
- JavaScript
- Web Dünyası
- Linux
- MİTHRİL FRAMEWORK
- Laravel
- Git
- React
- HTML LİNK(Bağlantı)EKLEME - LİNK VERME
- HTML YAZI VE RESİM ORTALAMA
- HTML RESME LİNK VERME
- HTML FORM OLUŞTURMA
- CSS YATAY MENÜ YAPIMI
- HTML RESİM EKLEME
- CSS (BOYUT) GENİŞLİK VE YÜKSEKLİK (Width-Height)
- HTML DİV ve SPAN NEDİR?
- HTML ARKAPLANA MÜZİK EKLEME
- KALİTE KAYBETMEDEN RESİMLERİ BÜYÜTME