Kako da hash-ujete password u Linux-u
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.
Bez komentara