Merhaba sayın THT üyeleri bu konumda sizlere hashleme hakkında bilgi vermek isterim, umarım bu yazıyı okuduğunuzda hashleme mantığını anlarsınız. Umarım kafanızda hashleme tabiri oturur. Ve aynı zamanda PHP ile uygulamalı bir şekilde anlatacağım daha rahat anlayabilmeniz adına.
~ Hash Nedir? ~
Hashleme bir veriyi sabit uzunlukta çıktıya çeviren matematiksel bir işlemdir. Hashleme şifreleme gibi değildir bir key üretmediği için hashlenen verileri geri döndürmek oldukça zordur. Peki hangi verileri hashleriz? Neden hashleriz? Hangi algoritmaları kullanırız? Gibi sorulara bu yazıda sizlere sunacağım aklınızda bir soru işareti kalmaması adına.
Öncelikle hangi verileri hashlemek gerektiği konusunu ele alalım. Kısa cevabı kritik bilgilerin güvenliği için. Kredi Kartları, Şifreler, Adresler, EPostalar gibi bir sistem için önemli olan verileri hashleriz. Örnek bir senaryo anlatayım daha rahat anlayın. Mesela sizin bir e-ticaret siteniz var ve aktif olarak kullanılıyor. Sisteme kayıt olan kullanıcıların verileri veri tabanına depolanıyor ve aynı zamanda hashleniyor. Böylece sitenizde olası veri sızıntısının önüne geçmiş oluyorsunuz. Kısacası güvenlik için.
Gelelim hangi algoritmaları kullanmamız gerektiği konulara, elbette çeşitli bir sürü algoritma mevcut fakat önemli olan güvenli algoritmaları kullanmak, hash çakışması dediğimiz olayın yaşanmaması adına, hash değeri önceden hesaplanıp rainbow table adı verilen saldırı türüne maruz kalmamak. O konulara da geleceğiz.
Peki neden bilgileri hashlememiz gerekiyor biraz da onu ele alalım, kısa cevabı güvenlik için. Günümüzde gelişen teknolojiler sebebi ile daha güçlü CPU'lar piyasaya çıkmış durumda ve buda Brute-Force saldırısını daha da kolay bir hale getiriyor. Saldırgan şifrenizi bulsa bile hashli bir şekilde buluyor. Ve algoritmanın çeşitliliğine göre gerekli işlemler yapıyor ama nafile. Pekala öyleyse algoritmalara geçelim. Güvensizden güvenlilere doğru ilerleyelim.
MD5 algoritması günümüzde artık pekte kullanılmayan bir algoritma, hash çakışması dediğimiz olay çok fazla yaşanıyor daha güçlü içerisinde salt değeri bulunduran algoritmalar daha da tercih ediliyor. PHP ile bir parolayı MD5 algoritmasını hashleyelim.
Kod;
Çıktı;
Gördüğünüz üzere "parola" değişkeninin içerisine tanımladığımız "admin" parolasını MD5 algoritması yardımı ile hashledik. SQL İnjection yaparken çektiğiniz verinin hashini kırmak için onca uğraş verdiğiniz şifre bu kadar kolay hashleniyor
(Bende ilk gördüğümde şaşırmıştım
)
Tamam admin parolamızı hashledik ama farklı biri daha aynı şekilde admin şifresini koyarsa ve o kişi de MD5 algoritmasını kullanırsa onunda alacağı hash değeri aynı olmaz mı? Evet aynı olur. Peki neden? MD5 algoritması salt kullanmıyor çünkü. Salt değeri de şifre aynı olsa bile farklı hash değerleri döndürür. Aşağı da örnekli bir şekilde anlatacağım daha rahat anlarsınız. Pekala şimdi hash çakışması dediğimiz olaya bakalım.
Kod;
Evet gördüğünüz gibi aynı şifreyi farklı değişkenlere tanımladım. Peki aynı hash değerini mi verecek? Evet aynı hash değerini bize döndürecektir. Bu da admin hash değerini daha da önemsiz bir hale getiriyor. Rainbow Table saldırısını daha da kolay bir hale getiriyor.
Çıktı;
Evet gördüğünüz gibi hash değerleri aynı buda saldırganlar için müthiş bir şey demektir. Peki şimdi MD5'den başka hashleme algoritmalarına bakalım Mesela SHA1 algoritmasına, Fakat oda aynı şekilde MD5 gibi günümüzde pek tercih edilmeyen bir algoritma. Onunda MD5 gibi bazı güvenlik sorunları var mesela yine aynı şekilde hash çakışması. Hemen bir örnek vereyim.
Kod;
Çıktı;
Gördüğünüz üzere admin12 parolasını SHA1 algoritması ile hashledik, burada SHA1 algoritmasını MD5'den farklı yapan kısım MD5 algoritmasından daha iyi olarak piyasaya sürülmesiydi fakat aradan geçen zaman içerisinde SHA1 algoritması da güvensiz bir algoritma olduğunu fark ettiler. Ve dediğim gibi aynı şekilde hash çakışmaları da yaşanmakta.
Çıktı;
Peki şimdi bir düşünelim salt değeri bulunmayan algoritmaların kullanışlarını biliyoruz, peki ne yapabiliriz de parolamız veya kullanıcı parolaları daha da güvenli olabilir? Şimdi bir düşünelim salt değeri üreten bir algoritmamız henüz elimizde yok. Peki biz bildiğimiz 2 algoritmayı birleştirsek şifremiz bir nebze de olsa güvenli olabilir mi? Bir nebze de olsa olur elbette fakat günümüz için değil
Öğrendiğimiz MD5 ve SHA1 gibi algoritmaları birleştirmeyi deneyelim.
Kod;
Çıktı;
Gördüğünüz üzere 2 algoritmayı da aynı anda kullanarak şifremizi hashledik. Önce SHA1 algoritmasını sonra da MD5 algoritmasını kullandık. Bu bir nebze de olsa şifremizi güvenli bir hale getirse de zaman içerisinde bu yöntem ile de hash çakışmaları yaşanıyor saldırganlar tarafından şifreler ele geçirilebiliyor. Bir örnek vereyim.
Kod;
Çıktı;
Peki şimdi gelelim günümüzde sıkça kullanılan ve otomatik salt değeri üretmesi sebebi ile "Bcrypt" algoritmasına üstte belirttiğim algoritmalardan daha güvenli bir algoritma olarak kabul edilen bu algoritma verilerini saklamak için muazzam bir hashleme algoritması. Bir örnek vereyim.
Kod;
Çıktı;
Aradaki fark fark ediliyordur
Bu algoritma şifrelerinizi verilerini daha güvenli bir hale getiriyor. İçerisinde ki salt değeri sayesinde şifreler aynı olsa bile farklı hash değerleri ürettiği için saldırganlar tarafından bulunması oldukça zor bir durum haline geliyor. Peki bir deneyelim aynı şifreyi kullansak bize aynı hash değerini mi döndürecek?
Kod;
Çıktı;
Gördüğünüz gibi şifre aynı olsa bile aldığımız hash değeri farklı, bunu sağlayan Bcrypt algoritmasının içerisinde var olan salt değeri. Olmasaydı eğer MD5, SHA1 ile aldığımız sonucun aynısını alırdık. Artık siz düşünün hangi algoritmayı kullanacağınızı
Peki sadece şifre hashlemek için mi kullanıyoruz? Hayır tabii ki bunun için en başa tekrar dönmemiz gerekiyor. Burası tamamı ile bize kalmış hangi verinin bizim için önemi var? Olası sızıntı durumunda kullanıcıların önemli verileri internete düşmemesi adına aldığımız bir önlem. Mesela bizim bir mesajlaşma projemiz var ve kullanıcıların mesajlarını hashlemek istiyoruz. Bunu da aynı şekilde Bcrypt algoritması ile yapacağız. Bir örnek vereyim.
Kod;
Çıktı;
Evet gördüğünüz gibi mesajları hashledik her biri de farklı değerler aldı, Aslında bunu MD5, SHA1 gibi algoritmalar ile de yapabilirdik çünkü mesajlar aynı değil. Aynı olmayınca alacağımız hash değeri de farklı olacaktı fakat dediğim gibi pekte güvenilir algoritmalar değiller hem böylesi daha güvenli. Mesaj içerikleri aynı olsa bile alacakları hash değeri farklı olacak.
Buraya kadar okuyan herkese teşekkür ederim. Umarım veri hashleme mantığını anlamışsınızdır. Umarım kafanızda oturtmuştur. Umarım anlayabilmişsinizdir. En azından SQL İnjection yaparken admin şifresini bulduğunuz zaman karşınızda ki karman çorman sayıları, harflerin nasıl yapıldığını anlamışsınızdır
~ Hash Nedir? ~
Hashleme bir veriyi sabit uzunlukta çıktıya çeviren matematiksel bir işlemdir. Hashleme şifreleme gibi değildir bir key üretmediği için hashlenen verileri geri döndürmek oldukça zordur. Peki hangi verileri hashleriz? Neden hashleriz? Hangi algoritmaları kullanırız? Gibi sorulara bu yazıda sizlere sunacağım aklınızda bir soru işareti kalmaması adına.
Öncelikle hangi verileri hashlemek gerektiği konusunu ele alalım. Kısa cevabı kritik bilgilerin güvenliği için. Kredi Kartları, Şifreler, Adresler, EPostalar gibi bir sistem için önemli olan verileri hashleriz. Örnek bir senaryo anlatayım daha rahat anlayın. Mesela sizin bir e-ticaret siteniz var ve aktif olarak kullanılıyor. Sisteme kayıt olan kullanıcıların verileri veri tabanına depolanıyor ve aynı zamanda hashleniyor. Böylece sitenizde olası veri sızıntısının önüne geçmiş oluyorsunuz. Kısacası güvenlik için.
Gelelim hangi algoritmaları kullanmamız gerektiği konulara, elbette çeşitli bir sürü algoritma mevcut fakat önemli olan güvenli algoritmaları kullanmak, hash çakışması dediğimiz olayın yaşanmaması adına, hash değeri önceden hesaplanıp rainbow table adı verilen saldırı türüne maruz kalmamak. O konulara da geleceğiz.
Peki neden bilgileri hashlememiz gerekiyor biraz da onu ele alalım, kısa cevabı güvenlik için. Günümüzde gelişen teknolojiler sebebi ile daha güçlü CPU'lar piyasaya çıkmış durumda ve buda Brute-Force saldırısını daha da kolay bir hale getiriyor. Saldırgan şifrenizi bulsa bile hashli bir şekilde buluyor. Ve algoritmanın çeşitliliğine göre gerekli işlemler yapıyor ama nafile. Pekala öyleyse algoritmalara geçelim. Güvensizden güvenlilere doğru ilerleyelim.
MD5 algoritması günümüzde artık pekte kullanılmayan bir algoritma, hash çakışması dediğimiz olay çok fazla yaşanıyor daha güçlü içerisinde salt değeri bulunduran algoritmalar daha da tercih ediliyor. PHP ile bir parolayı MD5 algoritmasını hashleyelim.
Kod;
Kod:
$parola = "admin";
echo "Parolaniz : " . md5($parola);
Çıktı;
Kod:
Parolaniz : 21232f297a57a5a743894a0e4a801fc3
Gördüğünüz üzere "parola" değişkeninin içerisine tanımladığımız "admin" parolasını MD5 algoritması yardımı ile hashledik. SQL İnjection yaparken çektiğiniz verinin hashini kırmak için onca uğraş verdiğiniz şifre bu kadar kolay hashleniyor
Tamam admin parolamızı hashledik ama farklı biri daha aynı şekilde admin şifresini koyarsa ve o kişi de MD5 algoritmasını kullanırsa onunda alacağı hash değeri aynı olmaz mı? Evet aynı olur. Peki neden? MD5 algoritması salt kullanmıyor çünkü. Salt değeri de şifre aynı olsa bile farklı hash değerleri döndürür. Aşağı da örnekli bir şekilde anlatacağım daha rahat anlarsınız. Pekala şimdi hash çakışması dediğimiz olaya bakalım.
Kod;
Kod:
$parola = "admin";
echo "1. Kullanici Parolasi : " . md5($parola) . "<br>";
$parola2 = "admin";
echo "2. Kullanıcı Parolasi : " . md5($parola2) . "<br>";
Çıktı;
Kod:
1. Kullanici Parolasi : 21232f297a57a5a743894a0e4a801fc3
2. Kullanıcı Parolasi : 21232f297a57a5a743894a0e4a801fc3
Evet gördüğünüz gibi hash değerleri aynı buda saldırganlar için müthiş bir şey demektir. Peki şimdi MD5'den başka hashleme algoritmalarına bakalım Mesela SHA1 algoritmasına, Fakat oda aynı şekilde MD5 gibi günümüzde pek tercih edilmeyen bir algoritma. Onunda MD5 gibi bazı güvenlik sorunları var mesela yine aynı şekilde hash çakışması. Hemen bir örnek vereyim.
Kod;
Kod:
$sifre = "admin12";
echo "Sifreniz : " . sha1($sifre);
Çıktı;
Kod:
Sifreniz : 38f078a81a2b033d197497af5b77f95b50bfcfb8
Gördüğünüz üzere admin12 parolasını SHA1 algoritması ile hashledik, burada SHA1 algoritmasını MD5'den farklı yapan kısım MD5 algoritmasından daha iyi olarak piyasaya sürülmesiydi fakat aradan geçen zaman içerisinde SHA1 algoritması da güvensiz bir algoritma olduğunu fark ettiler. Ve dediğim gibi aynı şekilde hash çakışmaları da yaşanmakta.
Çıktı;
Kod:
1. Kullanıcı Sifresi : 38f078a81a2b033d197497af5b77f95b50bfcfb8
2. Kullanıcı Sifresi : 38f078a81a2b033d197497af5b77f95b50bfcfb8
Peki şimdi bir düşünelim salt değeri bulunmayan algoritmaların kullanışlarını biliyoruz, peki ne yapabiliriz de parolamız veya kullanıcı parolaları daha da güvenli olabilir? Şimdi bir düşünelim salt değeri üreten bir algoritmamız henüz elimizde yok. Peki biz bildiğimiz 2 algoritmayı birleştirsek şifremiz bir nebze de olsa güvenli olabilir mi? Bir nebze de olsa olur elbette fakat günümüz için değil
Kod;
Kod:
$parola = "Admin_Admin";
echo "2 Algoritma ile hashlenmiş şifre : " . sha1(md5($parola));
Çıktı;
Kod:
2 Algoritma ile hashlenmiş şifre : ce54850caccf10ea047ce0cde9552baf0aa0996d
Gördüğünüz üzere 2 algoritmayı da aynı anda kullanarak şifremizi hashledik. Önce SHA1 algoritmasını sonra da MD5 algoritmasını kullandık. Bu bir nebze de olsa şifremizi güvenli bir hale getirse de zaman içerisinde bu yöntem ile de hash çakışmaları yaşanıyor saldırganlar tarafından şifreler ele geçirilebiliyor. Bir örnek vereyim.
Kod;
Kod:
$parola = "Admin_Admin";
echo "1. Kullanıcı Şifresi : " . sha1(md5($parola)) . "<br>";
$parola2 = "Admin_Admin";
echo "2. Kullanıcı Şifresi : " . sha1(md5($parola2)) . "<br>";
Çıktı;
Kod:
1. Kullanıcı Şifresi : ce54850caccf10ea047ce0cde9552baf0aa0996d
2. Kullanıcı Şifresi : ce54850caccf10ea047ce0cde9552baf0aa0996d
Peki şimdi gelelim günümüzde sıkça kullanılan ve otomatik salt değeri üretmesi sebebi ile "Bcrypt" algoritmasına üstte belirttiğim algoritmalardan daha güvenli bir algoritma olarak kabul edilen bu algoritma verilerini saklamak için muazzam bir hashleme algoritması. Bir örnek vereyim.
Kod;
Kod:
$parola = "admin";
$hashliParola = password_hash($parola, PASSWORD_BCRYPT);
echo "salt değerli parolanız : " . $hashliParola . "<br>";
Çıktı;
Kod:
salt değerli parolanız : $2y$10$4RsMUow43iQj8ccZVbM/heFOqIqIajO38Pnug6tUFjny1h8myEbzq
Aradaki fark fark ediliyordur
Kod;
Kod:
$parola = "admin";
$hashliParola = password_hash($parola, PASSWORD_BCRYPT);
echo "1. Kullanıcı Şifresi : " . $hashliParola . "<br>";
$parola2 = "admin";
$hashliParola2 = password_hash($parola2, PASSWORD_BCRYPT);
echo "2. Kullanıcı Şifresi : " . $hashliParola2 . "<br>";
Çıktı;
Kod:
1. Kullanıcı Şifresi : $2y$10$xkipTCZRtOwHrd9jBaLtj.ijpLusKpDW0NQ/QPQVWXe8Psve5JPVi
2. Kullanıcı Şifresi : $2y$10$sZXg7cZ7lyN1XXuA6AeZf.WLA6rT0/A.cagX37EXhdyf3u3paKMLi
Gördüğünüz gibi şifre aynı olsa bile aldığımız hash değeri farklı, bunu sağlayan Bcrypt algoritmasının içerisinde var olan salt değeri. Olmasaydı eğer MD5, SHA1 ile aldığımız sonucun aynısını alırdık. Artık siz düşünün hangi algoritmayı kullanacağınızı
Peki sadece şifre hashlemek için mi kullanıyoruz? Hayır tabii ki bunun için en başa tekrar dönmemiz gerekiyor. Burası tamamı ile bize kalmış hangi verinin bizim için önemi var? Olası sızıntı durumunda kullanıcıların önemli verileri internete düşmemesi adına aldığımız bir önlem. Mesela bizim bir mesajlaşma projemiz var ve kullanıcıların mesajlarını hashlemek istiyoruz. Bunu da aynı şekilde Bcrypt algoritması ile yapacağız. Bir örnek vereyim.
Kod;
Kod:
$Ahmet = "Selam, Nasılsın?";
$hashliMesaj = password_hash($Ahmet, PASSWORD_BCRYPT);
echo "Ahmetin Mesajı : " . $hashliMesaj . "<br>";
$Mehmet = "İyiyim sen nasılsın?";
$hashliMesaj2 = password_hash($Mehmet, PASSWORD_BCRYPT);
echo "Mehmetin Mesajı : " . $hashliMesaj2 . "<br>";
Çıktı;
Kod:
Ahmet'in Mesajı : $2y$10$BDhGS7Bdj2hGdaWmN7vKZe0UkjGRqPHHABfpzax1hYJfKbaJO5wWG
Mehmet'in Mesajı : $2y$10$5GkXj/lf3eaF/hkDITBc9eMHyP/n.WCcuZbMQGnXdMxyYAAW1e23e
Evet gördüğünüz gibi mesajları hashledik her biri de farklı değerler aldı, Aslında bunu MD5, SHA1 gibi algoritmalar ile de yapabilirdik çünkü mesajlar aynı değil. Aynı olmayınca alacağımız hash değeri de farklı olacaktı fakat dediğim gibi pekte güvenilir algoritmalar değiller hem böylesi daha güvenli. Mesaj içerikleri aynı olsa bile alacakları hash değeri farklı olacak.
Buraya kadar okuyan herkese teşekkür ederim. Umarım veri hashleme mantığını anlamışsınızdır. Umarım kafanızda oturtmuştur. Umarım anlayabilmişsinizdir. En azından SQL İnjection yaparken admin şifresini bulduğunuz zaman karşınızda ki karman çorman sayıları, harflerin nasıl yapıldığını anlamışsınızdır




