Password hashing nədir, nəyə görə lazımdır?

Yunis Huseynzade
Pragmatech
Published in
2 min readNov 7, 2020

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.

--

--