Hašovanie hesla v prostredí Java

Java Top

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

1. Prehľad

V tomto výučbe sa budeme zaoberať dôležitosťou hašovania hesiel.

Stručne sa pozrieme na to, čo to je, prečo je to dôležité, a na niektoré bezpečné a nezabezpečené spôsoby, ako to urobiť v prostredí Java.

2. Čo je hašovanie?

Hašovanie je proces generovania reťazca, príp hash, z daného správa pomocou matematickej funkcie známej ako a kryptografická hašovacia funkcia.

Aj keď existuje niekoľko hashovacích funkcií, musia byť tie, ktoré sú prispôsobené na hašovanie hesiel, zabezpečené štyrmi hlavnými vlastnosťami:

  1. To by malo byť deterministický: rovnaká správa spracovaná rovnakou hash funkciou by mala byť vždy vyrábať to isté hash
  2. Nie je to tak reverzibilné: je nepraktické generovať a správa z jeho hash
  3. Má vysoké entropia: malá zmena a správa by mali produkovať úplne iné hash
  4. A odoláva kolízie: dva rôzne správ by nemali vyrábať to isté hash

Hašovacia funkcia, ktorá má všetky štyri vlastnosti, je silným kandidátom na hašovanie hesiel, pretože spoločne dramaticky zvyšujú obtiažnosť spätného inžinierstva hesla z hashu.

Tiež však funkcie hašovania hesiel by mali byť pomalé. Pomohla by rýchly algoritmus hrubou silou útoky, pri ktorých sa hacker pokúsi uhádnuť heslo hašovaním a porovnaním miliárd (alebo biliónov) potenciálnych hesiel za sekundu.

Niektoré veľké hash funkcie, ktoré spĺňajú všetky tieto kritériá, súPBKDF2, BCrypt, a SCrypt. Najprv sa však pozrime na niektoré staršie algoritmy a na to, prečo sa už neodporúčajú

3. Neodporúča sa: MD5

Našou prvou hašovacou funkciou je MD5 algoritmus na správu správ, ktorý bol vyvinutý už v roku 1992.

Java MessageDigest umožňuje tento výpočet ľahko a môže byť ešte užitočný za iných okolností.

Avšak za posledných niekoľko rokov Bolo zistené, že MD5 zlyhal pri štvrtej vlastnosti šifrovania hesla v tom, že sa stalo výpočtovo ľahké generovať kolízie. Aby toho nebolo málo, MD5 je rýchly algoritmus, a preto je zbytočný proti útokom hrubou silou.

Z tohto dôvodu sa MD5 neodporúča.

4. Neodporúča sa: SHA-512

Ďalej sa pozrieme na SHA-512, ktorý je súčasťou rodiny Secure Hash Algorithm, rodiny, ktorá začala s SHA-0 už v roku 1993.

4.1. Prečo SHA-512?

Keď počítače zvyšujú svoju výkonnosť a keď nachádzame nové zraniteľné miesta, potom vedci odvodzujú nové verzie SHA. Novšie verzie majú postupne väčšiu dĺžku alebo niekedy výskumníci publikujú novú verziu základného algoritmu.

SHA-512 predstavuje najdlhší kľúč v tretej generácii algoritmu.

Zatiaľ čo teraz existujú bezpečnejšie verzie SHA, SHA-512 je najsilnejšia implementovaná v Jave.

4.2. Implementácia v Jave

Poďme sa teraz pozrieť na implementáciu hashového algoritmu SHA-512 v Jave.

Najprv musíme pochopiť pojem soľ. Jednoducho povedané, toto je náhodná sekvencia, ktorá sa generuje pre každý nový hash.

Zavedením tejto náhodnosti zvýšime hodnoty hash entropiaa chránime našu databázu pred predkompilovanými zoznamami hashov známych ako dúhové stoly.

Naša nová hash funkcia sa potom stane zhruba:

soľ <- generovať-soľ; hash <- soľ + ':' + sha512 (soľ + heslo)

4.3. Generovanie soli

Na zavedenie soli použijeme SecureRandom trieda z java.bezpečnosť:

SecureRandom random = nový SecureRandom (); byte [] soľ = nový bajt [16]; random.nextBytes (soľ);

Potom použijeme MessageDigest triedy nakonfigurovať SHA-512 funkcia hash s našou soľou:

MessageDigest md = MessageDigest.getInstance ("SHA-512"); md. aktualizácia (soľ);

A s tým doplneným môžeme teraz používať stráviť spôsob generovania nášho hašovaného hesla:

byte [] hashedPassword = md.digest (passwordToHash.getBytes (StandardCharsets.UTF_8));

4.4. Prečo sa to neodporúča?

Pri použití so soľou je SHA-512 stále spravodlivou voľbou, ale existujú silnejšie a pomalšie možnosti.

Zvyšné možnosti, ktoré pokryjeme, majú tiež dôležitú vlastnosť: konfigurovateľnú silu.

5. PBKDF2, BCrypt a SCrypt

PBKDF2, BCrypt a SCrypt sú tri odporúčané algoritmy.

5.1. Prečo sú odporúčané?

Každý z nich je pomalý a každý má vynikajúcu vlastnosť, že má nastaviteľnú silu.

To znamená, že s nárastom sily počítačov môžeme algoritmus spomaliť zmenou vstupov.

5.2. Implementácia PBKDF2 v Jave

Teraz, soli sú základným princípom hašovania hesiel, a preto potrebujeme jeden aj pre PBKDF2:

SecureRandom random = nový SecureRandom (); byte [] soľ = nový bajt [16]; random.nextBytes (soľ);

Ďalej vytvoríme a PBEKeySpec a a SecretKeyFactory ktoré vytvoríme pomocou PBKDF2WithHmacSHA1 algoritmus:

KeySpec spec = nový PBEKeySpec (heslo.toCharArray (), soľ, 65536, 128); SecretKeyFactory factory = SecretKeyFactory.getInstance ("PBKDF2WithHmacSHA1");

Tretí parameter (65536) je účinným parametrom sily. Udáva, koľko iterácií je spustených týmto algoritmom, čím sa zvyšuje čas potrebný na vytvorenie hash.

Nakoniec môžeme použiť našu SecretKeyFactory na vygenerovanie hash:

byte [] hash = factory.generateSecret (spec) .getEncoded ();

5.3. Implementácia BCrypt a SCrypt v Jave

Ukázalo sa teda, že Podpora BCrypt a SCrypt sa zatiaľ nedodáva s Javou, aj keď niektoré knižnice Java ich podporujú.

Jednou z týchto knižníc je Spring Security.

6. Šifrovanie hesla s jarnou bezpečnosťou

Aj keď Java natívne podporuje hašovacie algoritmy PBKDF2 aj SHA, nepodporuje algoritmy BCrypt a SCrypt.

Našťastie pre nás, spoločnosť Spring Security dodáva s podporou všetkých týchto odporúčaných algoritmov prostredníctvom servera PasswordEncoder rozhranie:

  • MessageDigestPasswordEncoder nám dáva MD5 a SHA-512
  • Pbkdf2PasswordEncoder dáva nám PBKDF2
  • BCryptPasswordEncoder dáva nám BCrypt a
  • SCryptPasswordEncoder nám dáva SCrypt

Kodéry hesiel pre PBKDF2, BCrypt a SCrypt prichádzajú s podporou konfigurácie požadovanej sily hašovania hesiel.

Tieto kódovacie zariadenia môžeme použiť priamo, a to aj bez aplikácie založenej na jarnom zabezpečení. Alebo, ak chránime náš web pomocou Spring Security, môžeme nakonfigurovať požadovaný kódovač hesiel prostredníctvom jeho DSL alebo prostredníctvom vloženia závislosti.

A na rozdiel od našich príkladov vyššie, tieto šifrovacie algoritmy pre nás interne vytvoria soľ. Algoritmus uloží soľ do výstupného hash na ďalšie použitie pri overovaní hesla.

7. Záver

Takže sme sa hlboko ponorili do hašovania hesiel; skúmanie koncepcie a jej použitia.

Pred kódovaním v jazyku Java sme sa pozreli na niektoré historické hašovacie funkcie, ako aj na niektoré aktuálne implementované funkcie.

Nakoniec sme videli, že Spring Security sa dodáva s triedami šifrovania hesiel, ktoré implementujú celý rad rôznych hash funkcií.

Ako vždy, kód je k dispozícii na GitHub.

Java dole

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

$config[zx-auto] not found$config[zx-overlay] not found