• auth
  • salasana
  • turvallisuus
  • hajauttaminen
  • bcrypt
  • argon2
  • sha1
  • sha2
  • kirjautuminen
  • sisäänkirjautuminen

Salasanan hajauttamisen kehitys

Saatat olla kuullut neuvoja siitä, millaisia salasanojen hajautusalgoritmeja kannattaa valita, mutta oletko miettinyt, miksi niitä suositellaan? Tässä artikkelissa tutkitaan salasanojen hajautusalgoritmien kehitystä ja niiden taustalla olevia syitä.

Gao
Gao
Founder

Johdanto

Salasanan hajauttaminen tarkoittaa salasanasta hash-arvon laskemista. Hash-arvo tallennetaan tyypillisesti tietokantaan, ja kirjautumisprosessissa käyttäjän syöttämän salasanan hash-arvo lasketaan ja verrataan tietokantaan tallennettuun hash-arvoon. Jos ne vastaavat toisiaan, käyttäjä todennetaan.

Ennen kuin sukellamme salasanojen hajautusalgoritmien kehitykseen, on tärkeää ymmärtää, miksi se on tarpeellista.

Salasanat selväkielisinä: Suuri turvallisuusriski

Kuvittele olevasi verkkosivuston käyttäjä, jolla olet rekisteröitynyt tilille. Eräänä päivänä verkkosivusto joutuu hakkeroiduksi, ja tietokanta vuotaa. Jos sivusto tallentaa salasanat selväkielisinä, hakkerilla on suora pääsy salasanaasi. Koska monet ihmiset käyttävät samaa salasanaa useilla verkkosivustoilla, hakkeri voi käyttää tätä salasanaa päästäkseen luvattomasti muihin tileihisi. Tilanne pahenee entisestään, jos käytät samaa tai samanlaista salasanaa sähköpostitilissäsi, sillä hakkeri voi nollata salasanasi ja ottaa haltuunsa kaikki tilit, jotka liittyvät siihen.

Ilman tietomurtoa suuremmissa tiimeissä kuka tahansa, jolla on pääsy tietokantaan, voi nähdä salasanat. Salasanat ovat verrattuna muihin tietoihin erittäin herkkiä, etkä varmasti halua, että kukaan pääsee niihin käsiksi.

Salasanojen tallentaminen ilman hajauttamista on aloittelijamainen virhe. Valitettavasti, jos etsit "salasanavuoto selväkielisenä", löydät, että merkittävät yritykset kuten Facebook, DailyQuiz ja GoDaddy ovat kaikki kokeneet salasanojen vuotoja selväkielisinä. On todennäköistä, että monet muut yritykset ovat tehneet saman virheen.

Koodaus vs. salaus vs. hajautus

Nämä kolme termiä sekoitetaan usein, mutta ne ovat erillisiä käsitteitä.

Koodaus

Koodaus on ensimmäinen asia, joka suljetaan pois salasanojen tallentamisessa. Esimerkiksi Base64 on koodausalgoritmi, joka muuntaa binääridatan merkkijonoksi:

Koodausalgoritmin tunteminen mahdollistaa koodatun merkkijonon dekoodaamisen ja alkuperäisten tietojen noutamisen:

Hakkereille useimmat koodausalgoritmit ovat yhtä arvoisia kuin selväkieli.

Salaus

Ennen kuin hajautus saavutti suosiota, salausta käytettiin tallentamaan salasanoja, kuten AES:llä. Salaus käyttää avainta (tai avainparia) tietojen salaamiseen ja avaamiseen.

Salauksen ongelma on ilmeinen termissä "purkaa salaus". Salaus on käännettävissä, mikä tarkoittaa, että jos hakkeri saa avaimen haltuunsa, he voivat purkaa salasanan ja saada selväkielisen salasanan.

Hajautus

Tärkein ero hajautuksen, koodauksen ja salauksen välillä on, että hajautus on peruuttamaton. Kun salasana on hajautettu, sitä ei voida purkaa takaisin alkuperäiseen muotoonsa.

Verkkosivuston omistajana et oikeastaan tarvitse tietää itse salasanaa, kunhan käyttäjä voi kirjautua sisään oikealla salasanalla. Rekisteröintiprosessi voidaan yksinkertaistaa seuraavasti:

  1. Käyttäjä syöttää salasanan.
  2. Palvelu käyttää hajautusalgoritmia salasanan hash-arvon laskemiseen.
  3. Palvelu tallentaa hash-arvon tietokantaan.

Kun käyttäjä kirjautuu sisään, prosessi on:

  1. Käyttäjä syöttää salasanan.
  2. Palvelu käyttää samaa hajautusalgoritmia laskeakseen salasanan hash-arvon.
  3. Palvelu vertaa hash-arvoa tietokantaan tallennettuun hash-arvoon.
  4. Jos hash-arvot vastaavat, käyttäjä todennetaan.

Molemmat prosessit välttävät salasanojen tallentamisen selväkielisinä, ja koska hajautus on peruuttamaton, vaikka tietokanta vaarantuisi, hakkeri voi saada vain hash-arvot, jotka näyttävät satunnaisilta merkkijonoilta.

Hajautusalgoritmien lähtöpaketti

Hajautus saattaa vaikuttaa täydelliseltä ratkaisulta salasanojen tallennukseen, mutta se ei ole niin yksinkertaista. Ymmärtääksemme miksi, tutustutaan salasanojen hajautusalgoritmien kehitykseen.

MD5

Vuonna 1992 Ron Rivest suunnitteli MD5-algoritmin, joka on viestin tiivistysalgoritmi, joka voi laskea 128-bittisen hash-arvon mistä tahansa datasta. MD5:sta on käytetty laajasti eri aloilla, mukaan lukien salasanojen hajauttamiseksi. Esimerkiksi "123456":n MD5-hash-arvo on:

Kuten aiemmin mainittiin, hash-arvo näyttää satunnaiselta merkkijonolta ja on peruuttamaton. Lisäksi MD5 on nopea ja helppo toteuttaa, mikä teki siitä suositun salasanojen hajautusalgoritmin.

Kuitenkin MD5:n edut ovat myös sen heikkouksia salasanojen hajauttamisessa. Sen nopeus tekee siitä haavoittuvan brute-force-hyökkäyksille. Jos hakkerilla on luettelo yleisistä salasanoista ja henkilökohtaisista tiedoistasi, he voivat laskea joka yhdistelmän MD5-hash-arvon ja verrata niitä tietokannan hash-arvoihin. Esimerkiksi he saattavat yhdistää syntymäpäiväsi nimesi tai lemmikkisi nimen kanssa.

Nykyisin tietokoneet ovat huomattavasti tehokkaampia kuin ennen, mikä tekee MD5-salasanojen bruteforcingista helppoa.

SHA-perhe

Miksi ei käytetä toista algoritmia, joka tuottaa pidempiä hash-arvoja? SHA-perhe vaikuttaa hyvältä valinnalta. SHA-1 on hajautusalgoritmi, joka tuottaa 160-bittisiä hash-arvoja, ja SHA-2 on hajautusalgoritmien perhe, joka tuottaa 224-, 256-, 384- ja 512-bittisiä hash-arvoja. Katsotaanpa "123456":n SHA-256-hash-arvo:

SHA-256-hash-arvo on huomattavasti pidempi kuin MD5, ja se on myös peruuttamaton. Kuitenkin on toinen ongelma: jos tunnet hash-arvon, kuten yllä olevan, ja näet saman hash-arvon tietokannassa, tiedät salasanan olevan "123456". Hakkeri voi luoda luettelon yleisistä salasanoista ja niiden vastaavista hash-arvoista ja verrata niitä tietokannan hash-arvoihin. Tätä luetteloa kutsutaan sateenkaaritaulukoksi.

Suola

Sateenkaaritaulukkoihin perustuvien hyökkäysten torjumiseksi otettiin käyttöön suolan käsite. Suola on satunnainen merkkijono, joka lisätään salasanaan ennen hajautusta. Esimerkiksi, jos suola on "suola", ja haluat käyttää SHA-256:ta hajauttaaksesi salasanan "123456" suolan kanssa, sen sijaan että yksinkertaisesti tekisit näin:

Tekisitkin näin:

Kuten näet, tulos on täysin erilainen kuin hajautus ilman suolaa. Tyypillisesti jokaiselle käyttäjälle annetaan satunnainen suola rekisteröinnin yhteydessä, ja se tallennetaan tietokantaan hash-arvon rinnalle. Kirjautumisprosessissa suolaa käytetään syötetyn salasanan hash-arvon laskemiseen, joka sitten verrataan tallennettuun hash-arvoon.

Iterointi

Vaikka suola on lisätty, hash-arvo on edelleen alttiina brute-force-hyökkäyksille kun laitteistot kehittyvät voimakkaammiksi. Tehdäkseen sen vaikeaksi, voidaan ottaa käyttöön iterointi (eli hajautusalgoritmin suorittaminen useita kertoja). Esimerkiksi sen sijaan että käyttäisit:

Voisit käyttää:

Iteraatioiden määrän lisääminen tekee brute-forcesta vaikeampaa. Tämä vaikuttaa kuitenkin myös kirjautumisprosessiin, sillä se hidastuu. Siksi on tarpeen löytää tasapaino turvallisuuden ja suorituskyvyn välillä.

Puoliajan tauko

Otetaan tauko ja tiivistetään hyvän salasanan hajautusalgoritmin ominaisuuksia:

  • Peruuttamaton (alkuperäiskuvavastus)
  • Vaikea brute forcata
  • Kestävä sateenkaaritaulukkohyökkäyksille

Kuten saatat huomata, suola ja iterointi ovat välttämättömiä kaikkien näiden vaatimusten täyttämiseksi. Ongelma on, että sekä MD5 että SHA-perhe eivät ole erityisesti suunniteltu salasanan hajauttamiseksi; niitä käytetään laajasti eheyden tarkistamisessa (tai "viestin tiivistys"). Tämän vuoksi jokaisella verkkosivustolla voi olla oma suola- ja iterointitoteutuksensa, mikä tekee standardoinnista ja siirroista haastavaa.

Salasanojen hajautusalgoritmit

Tämän ongelman ratkaisemiseksi on suunniteltu useita hajautusalgoritmeja erityisesti salasanojen hajauttamiseen. Tarkastellaanpa joitakin niistä.

bcrypt

bcrypt on salasanojen hajautusalgoritmi, jonka on suunnitellut Niels Provos ja David Mazières. Se on laajalti käytetty monissa ohjelmointikielissä. Tässä on esimerkki bcrypt-hash-arvosta:

Vaikka se vaikuttaa toiselta satunnaiselta merkkijonolta, se sisältää lisätietoja. Tarkastellaanpa sitä tarkemmin:

  • Ensimmäinen osa $2y osoittaa algoritmin, joka on 2y.
  • Toinen osa $12 osoittaa iterointikerran määrän, joka on 12. Tämä tarkoittaa, että hajautusalgoritmi suoritetaan 212=4096 kertaa (iterointi).
  • Kolmas osa wNt7lt/xf8wRJgPU7kK2ju on suola.
  • Viimeinen osa GrirhHK4gdb0NiCRdsSoAxqQoNbiluu on hash-arvo.

bcryptillä on joitakin rajoituksia:

  • Salasanan enimmäispituus on 72 tavua.
  • Suola on rajoitettu 16 tavuun.
  • Hash-arvo on rajoitettu 184 bittiin.

Argon2

Käytyjen keskusteluiden ja olemassa olevien salasanojen hajautusalgoritmien rajoitusten vuoksi vuonna 2015 pidettiin salasanojen hajautuskilpailu. Jättämällä yksityiskohdat väliin, keskitytään voittajaan: Argon2.

Argon2 on salasanojen hajautusalgoritmi, jonka ovat suunnitelleet Alex Biryukov, Daniel Dinu ja Dmitry Khovratovich. Se esittelee useita uusia käsitteitä:

  • Muistinkulutus: Algoritmi on suunniteltu vaikeaksi rinnakkaistaa, mikä tekee brute-force-hyökkäykset GPU:illa haastaviksi.
  • Aikakulutus: Algoritmi on suunniteltu vaikeaksi optimoida, mikä tekee brute-force-hyökkäykset ASIC:eilla (sovelluskohtaiset integroidut piirit) vaikeiksi.
  • Sivujuontovastustus: Algoritmi on suunniteltu kestäväksi sivujuontohyökkäyksille, kuten ajoitushyökkäyksille.

On olemassa kaksi pääasiallista versiota Argon2:sta, Argon2i ja Argon2d. Argon2i on turvallisin sivujoontohyökkäyksiä vastaan, kun taas Argon2d tarjoaa suurimman vastustuksen GPU-murtamisen hyökkäyksiä vastaan.

-- Argon2

Tässä on esimerkki Argon2-hash-arvosta:

Tarkastellaanpa sitä tarkemmin:

  • Ensimmäinen osa $argon2i osoittaa algoritmin, joka on argon2i.
  • Toinen osa $v=19 osoittaa version, joka on 19.
  • Kolmas osa $m=16,t=2,p=1 osoittaa muistinkustannukset, aikakustannukset ja rinnakkaisuusasteen, jotka ovat 16, 2 ja 1.
  • Neljäs osa $YTZ5ZnpXRWN5SlpjMHBDRQ on suola.
  • Viimeinen osa $12oUmJ6xV5bIadzZHkuLTg on hash-arvo.

Argon2:ssa salasanan enimmäispituus on 232-1 tavua, suola on rajoitettu 232-1 tavuun, ja hash-arvo on rajoitettu 232-1 tavuun. Tämä pitäisi riittää useimpiin tilanteisiin.

Argon2 on nyt saatavilla monissa ohjelmointikielissä, kuten node-argon2 Node.js:lle ja argon2-cffi Pythonille.

Johtopäätökset

Vuosien varrella salasanojen hajautusalgoritmit ovat kokeneet merkittävää kehitystä. Olemme kiitollisuudenvelassa turvallisuusyhteisölle heidän vuosikymmenten työstä internetin tekemiseksi turvallisemmaksi paikaksi. Heidän panoksensa ansiosta kehittäjät voivat kiinnittää enemmän huomiota parempien palvelujen rakentamiseen ilman huolenaiheita salasanojen hajautuksen turvallisuudesta. Vaikka 100% turvallisuuden saavuttaminen järjestelmässä voi olla saavuttamatonta, voimme käyttää erilaisia strategioita vähentääksemme riskejä.

Jos haluat välttää tunnistautumisen ja valtuutuksen toteuttamisen vaivan, kokeile vapaasti Logtoa ilmaiseksi. Tarjoamme turvallisia (käytämme Argon2:ta!), luotettavia ja skaalautuvia ratkaisuja, jotka mahdollistavat keskittymisesi tuotteesi rakentamiseen.