kako da hash-ujete password

Kako da hash-ujete password u Linux-u

15 децембра, 2021

Kao što znate password-e nikada ne bi trebalo da čuvate kao plain text. Bez obzira da li je u pitanju web aplikacija ili operativni sistem, password bi uvek trebalo da bude u hash obliku (na primer u Linux-u hash-ovani password-i se čuvaju u /etc/shadow fajlu). Zato ćemo mi u ovom tekstu objasniti kako da hash-ujete password u Linux-u.

Hash-ovanje je proces u kojem se password pomoću složenih algoritama prebacuje u neki drugi string. U pitanju je jednosmerni proces, što znači da jednom hash-ovan oblik password nije moguće vratiti u njegov originalni oblik (plain text). Hash-ovanje često podrazumeva korišćenje random podataka kao dodatni imput za hash algoritam, tako da jedan password koji je hash-ovan dva puta, ne daje isti rezultat. Ovi random podaci se zovu salt.

Hash-ovanje password-a sa mkpasswd

Prvi metod za generisanje password hash-a kojim ćemo se u ovom tekstu baviti, podrazumeva korišćenje mkpasswd alata. Ova aplikacija je dostupna u zvaničnim repozitorijumima svih najpoznatijih Linux distribucija. Da biste je instalirali na Fedori pokrenite sledeću komandu:

$ sudo dnf install mkpasswd

Na Debianu i njegovim derivatima, aplikacija je deo WHOIS paketa (trebalo bi da je podrazumevano instalirana):

$ sudo apt install whois

Kada je aplikacija instalirana na vašem sistemu, možemo da je koristimo za hash-ovanje našeg plain text password-a. Evo osnovne sintakse:

$ mkpasswd -m <hashing-algorithm>

Korišćenjem opcije -m (skraćeno od --method) određujemo koji hash algoritam želimo da koristimo. Da biste videli listu raspoloživih algoritama, potrebno je da dodate HELP kao argument ove opcije:

$ mkpasswd -m help
Available methods:
yescrypt Yescrypt
gost-yescrypt GOST Yescrypt
scrypt scrypt
bcrypt bcrypt
bcrypt-a bcrypt (obsolete $2a$ version)
sha512crypt SHA-512
sha256crypt SHA-256
sunmd5 SunMD5
md5crypt MD5
bsdicrypt BSDI extended DES-based crypt(3)
descrypt standard 56 bit DES-based crypt(3)
nt NT-Hash

Preporučeni algoritam je sha512crypt (koji se koristi u Linux-u). Čim pokrenemo komandu, dobićemo upit da unesemo password koji želimo da hash-ujemo. Program radi interaktivno zbog sigurnosnih razloga. Ako treba da unesemo plain text password direktno kao argument neke opcije, biće vidljiv u output-u PS kao deo komande, kao i u shell history-u. Hash-ovan password je vraćen kao output komande:

$ mkpasswd -m sha512crypt
Password:
$6$2sE/010goDuRSxxv$o18K52wor.wIwZp6aXXBC69phYwPQahKQo2ex8ce2.f0V9BtnYZc0KtTB0WGm2m5pNOcL1Ep3kgDWmJCz36B./

Salt se generiše nasumično (random), a za eksplicitno dodavanje vrednosti možemo da koristimo opciju -s (skraćeno od --salt).

Ako iz nekog razloga želimo da unesemo password za hash-ovanje na tzv. ne-interaktivan način (što svakako nije preporučeno), koristićemo --stdin opciju i redirekciju:

$ mkpasswd -m sha512crypt --stdin <<< "plainpassword"

Hash-ovanje password-a pomoću Python-a

Još jedan metod koji možemo da koristimo da generišemo password hash u Linux-u je da koristimo Python i crypt modul. Prvo treba da importujemo modul, a zatim koristimo crypt funkciju unutar modula. Ova funkcija ima jedan obavezan argument, a to je plain text koji želimo da enkriptujemo. Ona vraća jednosmerno hash-ovan password prepend-ovan salt-om. Hash metod može biti dodat eksplicitno kao drugi argument funkcije, odabirom nekog od sledećih:

crypt.METHOD_SHA512
crypt.METHOD_SHA256
crypt.METHOD_BLOWFISH
crypt.METHOD_MD5
crypt.METHOD_CRYPT

Metod crypt.METHOD_sha512 je najjači. Kada koristimo ovaj metod, password se hash-uje sa sha512 funkcijom i sa salt-om od 16 karaktera.

Da biste izbegli dodavanje originalnog password-a kao deo komande, koji će takođe biti zapamćen u Python shell history-ju, trebalo bi takođe da importujete getpass modul.

Da biste generisali hash-ovan password nastavite na sledeći način:

>>> import crypt
>>> import getpass
hashed_password = crypt.crypt(getpass.getpass(), crypt.METHOD_SHA512)
Password:

Kada radite iz shell-a, ovaj primer može biti izvršen u jednoj liniji, pozivajući Python-ov interpreter pomoću -c opcije. Na ovaj način možemo da odredimo komandu koja će direktno biti izvršena:

$ hashed_password="$(python3 -c 'import crypt; import getpass; print(crypt.crypt(getpass.getpass(), crypt.METHOD_SHA512))')"

Hash-ovanje password-a pomoću openssl-a

Treći i poslednji metod za generisanje hash-ovanog password-a kojim se bavimo u ovom tekstu, podrazumeva korišćenje openssl passwd komande. Podrazumevano ova komanda koristi crypt algoritam da generiše hash-ovan password. Da bismo umesto toga koristili sha512 algoritam, potrebno je da koristimo -6 opciju:

$ openssl passwd -6
Password:
Verifying - Password:
$6$82Bk5H60hZqXBSUp$GPdqJ1zNQOXwuXqUBBB59a4oaKah/HpR3nbiNrW1eXXPH48mTRZ3y6cOOMHnBtMjLF9IBfhDWfQMXMk8kM5kZ/

Kako smo već pomenuli, čak i kod ovog metoda password je zahtevan interaktivno. Dodatno, takođe se traži da on bude unet i drugi put, radi provere. Ova funkcionalnost može biti onemogućena korišćenjem opcije --noverify.

Kao i kod drugih metoda, salt je generisan automatski, ali ovde imamo i opciju da ga obezbedimo direktno korišćenjem --salt opcije.

$ openssl passwd -6 --salt <SALT>

Takođe, imamo opciju da pročitamo password iz fajla. Sve što treba da uradimo je da koristimo -in opciju i dodamo putanju fajla koji koristi password kao argument. Ako pretpostavimo da je naš password zapisan u password.txz fajlu, trebalo bi da napišemo:

$ openssl passwd -6 -in password.txt

Kada koristimo ovu opciju, možemo da obezbedimo više od jednog password-a u fajlu (jedan po liniji). Oni će u tom slučaju biti hash-ovani odvojeno a rezultat toga će biti vraćen pomoću komande.Tako na neki od navedenih načina možete da hash-ujete password u Linux-u.

Slični postovi:

Bez komentara

Оставите одговор

Ваша адреса е-поште неће бити објављена.