Password hashing nədir, nəyə görə lazımdır?
Sosial media yaratdığınızı düşünün. Bu aplikasiyada hər bir hesabın parolu olacaq. Bildiyiniz kimi, parol gizli qalmalıdır. Lakin hər hansı bir hacker databazadan məlumat çəkə bilsə o zaman ordakı parolları da oğurlaya bilər. Bəzi insanlar parol olaraq digər parollarını, gizli məlumatlarını hətta kart nömrəsini belə işlədə bilər. Bu security boşluğunun törədəcəyi problemləri təsəvvür edə bilərsiniz.
Bu problemin ən optimal həll yolu parolları plain text əvəzinə hash edilmiş şəkildə saxlamaqdır. Bunun üçün bir çox yol var. Lakin mən bu məqalədə bcrypt library-dən istifadə edəcəm. Bcrypt C, C++, C#, Elixir, Go, Java, JavaScript, Perl, PHP, Python, Ruby və s. dillərdə istifadə edilə bilən password hashing funksiyasıdır.
İşləmə prinsipi
MD5, SHA1, SHA256, SHA512, SHA-3 kimi bir çox alqoritmlər varkən niyə bcrypt-dan istifadə etməyimiz lazım olduğunu belə izah edə bilərik.
İstifadə
Bu maqələdə biz Python-dan istifadə edəcik. Python-da bcrypt-dan istifadə etmək üçün bcrypt modulundan istifadə edilir.
pip3 install bcrypt
İndi isə .py faylı yaradaq və kodlarımızı yazmağa başlayaq.
İlk olaraq bcrypt-i import edək.
import bcrypt
Daha sonra isə terminal-dan input qəbul edərək, bu input üzərində işləməyə başlayaq.
passToHash = input('Parolu daxil edin: ')
Parolu hash etmək üçün bcrypt.hashpw
metodundan istifadə edilir. Bu metod 2 məcburi parametr qəbul edir
- Bytes tipində parol
- salt
Salt-u əldə etmək üçün isə bcrypt.gensalt
metodundan istifadə edilir.
salt = bcrypt.gensalt()
Bu metod heç bir məcburi parametr qəbul etmir.
hashpw metodu
İndi isə parolu hash etmək üçün lazım olan kodları yazaq.
hashedPass = bcrypt.hashpw(passToHash.encode(), salt)
Nəticə
Parolu daxil edin: blabla123
b'$2b$12$kGRvx42fssJChGmaOXzsauWJHDRjhZpsbEJIrVgjeEHDBW5j0./Cy'
Gördüyünüz kimi hashpw metodu bytes tipində dəyər qaytarır. bcrypt.hashpw
metoduna parol ötürərkən yuxarıdakı nümunədə olduğu kimi .encode() etməyi unutmayın. Bu metod string-i bytes-a çevirir.
ər.Bunu da qeyd etməliyəm ki, bytes tipində olan dəyişəni müəyyən databazalar qəbul etmir. Məsələn, MongoDB. Bunun üçün də hash edilmiş parolu .decode() edərək saxlamaq daha uyğundur.
Nəticə
Parolu daxil edin: blabla123
$2b$12$E3A6i.F5DQvmRiBOd6pjKO9KSE.jhZ65qs5lu2SZFq.pIh3gIVnV.
checkpw metodu
İndi isə login zamanı parolun doğru olub olmamasını necə yoxlayacağımıza baxaq.
Bunun üçün bcrypt.checkpw
metodundan istifadə edilir. 2 məcburi parametr qəbul edir.
- parol
- hash
hər iki parametr də bytes tipində olmalıdır.
İndi isə yoxlamalı olduğumuz parol dəyişənə əlavə edək.
passToCheck = input('Parolu daxil edin: ')
Daha sonra check əməliyyatı üçün metoddan istifadə edək.
bcrypt.checkpw(passToCheck.encode(), hashedPass.encode())
Bu metod bool tipində dəyər qaytaracaq. Əgər parol uyğun gəlirsə True, gəlmirsə False qaytaracaq. Terminala nəticəni çap etdirdikdən sonra isə artıq password hashing-in necə olduğunu anlayacağıq. Qeyd edim ki hash edilmiş string-dən biz parolu əldə edə bilmərik. Yəni hash-in geri dönüşü olmur.
Yoxlamalar
Parolu daxil edin: hello123
$2b$12$FbOIcOANdBBLS.3jhew.WeLGddlD0zTMqlC/DtE9mOUb44C8DjwPO
Parolu daxil edin: blabla123
False
Yuxarıdakı parolların bir biri ilə uyğun olmadığına görə False qaytarıldı.
Parolu daxil edin: blabla123
$2b$12$PoIm1sV4/P3HRr.cXoPMAeKEc2suAbSjanqnnfWGLK.8Byr/w9c5C
Parolu daxil edin: blabla123
True
Bu nümunədə isə parolların eyni olduğuna görə True qaytarıldı.
İstifadə olunmuş mənbələr:
https://pypi.org/project/bcrypt/
https://en.wikipedia.org/wiki/Bcrypt
Məqaləni oxuduğunuz üçün təşəkkürlər.