On yleinen väärinkäsitys siitä, että hash ja salaus ovat sama asia. Ne eivät ole. Hash on peruuttamaton. Otetaan esimerkkinä seuraava esimerkki:
$ echo-n Password123 | md5sum
42f749ade7f9e195bf475f37a44cafcb-
Välitämme merkkijonon "Password123" MD5-algoritmille (algo), joka suorittaa matemaattisen toiminnon ja palauttaa tuotetun heksadesimaalisen koodatun hash. Ainoa tapa saada sama hash-lähtöarvo on syöttää algo alkuperäisesti. On ristiriitoja, mutta voimme keskustella siitä myöhemmin.
Useimpien hash-algoritmien tulostus on heksadesimaalikoodattu kiinteän pituinen binäärimerkkijono. Toiset, kuten tämä esimerkki, käyttävät Base64-koodattuja merkkijonoja tuotoksena. Huomaa, että pituus on aina sama:
{SHA} uNF8eZRJ8jmr8WTjyocRJPVpe7w =
{SHA} lqdu/Zr6o2dgIER8Up1/7lcUtgw =
{SHA} qYUOwLMlDEuukA5HCT4LR1kQzco =
{SHA} MXZBCpyWJ7TTs1w2kgGJslwNwTg =
{SHA} 2sAPLaUh9Mz0bI + XxKEg7qyABe8=
TL; Dr.
En halua puhua liikaa salauksesta (koska nuo jutut ovat kirjoja varten), mutta tärkeää on pystyä erottamaan hash-merkkijonot salausmerkkijonoista. Salaus täyttää yleensä merkkijonon, joka täyttää tietyn pituuden ennen kuin salaus tapahtuu. Se vaatii myös avaimen (tai salasanan) salauksen purkamiseksi. Jos käytät salattua salasanaa, merkkijono muuttuu syötteen pituuden mukaan. Jos näet joukon salatekstien salasanoja, pituus vaihtelee ja saatat käsitellä salausta hash: n sijaan. AES-256-CBC Esimerkki Salattu merkkijono ja siihen liittyvä tavallinen teksti (avain on "ASDF"):
foobar | U2FsdGVkX19G + KtytNHdj6yH2AVvX26pEmtunS/PRnU = foobarfoobar | U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog = foobarfoobarfoobar | U2FsdGVkX1/EOnUt57TCW4Rh0EdNnWX + ldatuqv2xexeaeoww0xg/EXJUe9aSUz $ kissa salattu_salasanat U2FsdGVkX19G + KtytNHdj6yH2AVvX26pEmtunS/PRnU = U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog = U2FsdGVkX1/EOnUt57TCW4Rh0EdNnWX + lDatuQv2xEXXeAeowW0XG/EXJUe9aSUz $ for i in `cat encrypted_passwords`; do echo $i | openssl enc -base64 -d -aes-256-cbc -pass pass:asdf; kaiku; Valmis foobar foobarfoobari foobarfoobarfoobar
Nyt saatat ajatella: Olet ehkä oikeassa. Se, että kriittisen materiaalin on oltava järjestelmän käytettävissä, tarkoittaa kuitenkin sitä, että pohjimmiltaan pelkkä teksti-pääsalasana sijaitsee jossain-joko RSA-avaimena tai salasanana tai tiedostossa, upotettuna tietokantaan, kovakoodattuna sovelluksessa tai salasanana jossain muistissa. pfft, kukaan ' ei käytä asdf:ää avaimena käyttäjiensä ' salasanojen
salaamiseen Käytä samaa merkkijonoa MD5:lle:
foobar | 3858f62230ac3c915f300c664312c63f foobarfoobar | 59faa421729e846dd800dce59943bfc0 foobarfoobarfoobar | 1352aadab322d1a033c27964be0965db
Hashsalasana ei ole kaukana täydellisestä, itse asiassa se on vähän huono, mutta se on huonompi kuin salaus sen takia, mitä se yrittää saavuttaa. Käyttäjät valitsevat ehdottoman vähimmäisvaatimuksen useammin kuin not ja voivat käyttää sitä useilla sivustoilla. Monet "hakkeroinnit" ovat itse asiassa vain valtuustodistusten uudelleenkäyttöhyökkäyksiä. Jos alkuperäinen kompromissi on salauksen käyttäminen, ainoa ponnistelu, jonka hyökkääjän on tehtävä, on löytää avain, joka purkaa kaikki salasanat. Hasheille heidän on ainakin tehtävä vaivaa niiden murtamiseen. Kun käytetään nykyaikaisten algoritmien, kuten sha512crypt, bcrypt, scrypt tai argon2, kanssa, hash-arvojen murtaminen voi vaatia paljon vaivaa.
Suolan lisääminen on merkkijonon lisääminen salasanaan ennen hashiä. Jokaisen hash-suolan pitäisi olla ainutlaatuinen ja yleensä satunnaisesti valittu, koska tärkeintä on, että sama selkeä teksti "salasana" hash-arvo on joka kerta erilainen. Tämä tekee salasananmurtajan elämästä vaikeaa, sillä tarkistaakseen sanan "salasana" jokaiselle käyttäjälle 1000 käyttäjän joukossa, jokaiselle käyttäjälle on ainutlaatuinen SALT, joka heidän on tehtävä 1000 kertaa-kerran per käyttäjä/SALT. Tämä tarkoittaa myös sitä, että he eivät voi käyttää valmiiksi koottuja sanakirjoja tai sateenkaaritaulukoita tehokkaasti (yleensä...), koska ne tarvitsevat mukautetun per suola.
Sivustot sotkevat tämän joskus ja käyttävät yleistä suolaa kaikille käyttäjille; Tämä on vastoin tarkoitusta.
Tässä on SHA1-hash-arvo suolalla:
b353977827f67a4ae0318f3a9447fae1c13d9d90:b8d18ca |___________________________________________| hash | suola | separator
Tämän hashin selkeä teksti on "salasana". Sen suolaarvo on "b8d18ca" ja sitä käytetään SHA1 ($salt.$pass) API: ssa. Tämä tarkoittaa, että algoritmi saa salasanan selkeän tekstin, luo suolan ja lisää sen selkeän tekstin eteen. Kun verkkosivusto tai sovellus yrittää vahvistaa salasanasi tulevaisuudessa, se ottaa selkeän tekstin salasanasi syötteenä, lukee suola-arvon tallennetusta hashista, lisää sen valitsemasi salasanan eteen ja vertaa tuotetun hash-arvon tallennettuun hash-arvoon. Jos et tiedä, että osa siitä on suolaa, hash tuottaa seuraavan tavallisen tekstin:
b8d18capassword
Koska algoritmi syöttää tavallista tekstiä, suola ja luotu hash-arvo voi pysyä läpinäkyvänä käyttäjälle. Halkeilun yhteydessä, jos algoritmi on suolainen, meidän on tiedettävä suola, jotta voimme tarjota sen ehdokkaan selkeän tekstin luomisessa.
Suolaus tekee halkeilusta aikaa vievämpää, jos se toteutetaan oikein. Satunnaisilla suoloilla pakotat Crackerin tuhlaamaan aikaa yrittäessään murtaa hash-arvot, jotka eivät vastaa suolaa. Tämä täyttää suunnilleen vaivaa, joka vaaditaan laitteen nopeudelle/suolojen numerolle, koska meidän on luotava ehdokas jokaiselle suolalle. Jos suola on staattinen, matemaattinen toiminto on sama... speed_of_device/1. Toinen tapa tarkastella tätä:
Our GTX 980 cracks SHA1 ($salt.$pass) at 3576,8 MH/s tai 3,5 miljardia ehdokkaita per sekunti hashlistamme sisältää 1000 ainutlaatuista suolaa 3 500 000 000 / 1000 = 3 500 000 ehdokkaita per sekunti
Tämä on kolme suuruusluokkaa hitaampaa, menetys 99,9 %. Staattisella suolalla se näyttää tältä:
Our GTX 980 cracks SHA1 ($salt.$pass) at 3576,8 MH/s tai 3,5 miljardia ehdokasta per sekunti hashlistamme sisältää 1 ainutlaatuisen suolan 3 500 000 000 / 1 = 3 500 000 000 ehdokkaat per sekunti
Jos tämä ei ole järkevää, jatka lukemista, meillä on hieno kaavio myöhemmin...
Toinen yleinen parannus verrattuna yksinkertaiseen "hash this plaintext" on, että "hash this plaintext, sitten hash that result, sitten hash that result" toistetaan tuhansia kertoja. Tämä mahdollistaa yksittäisen ehdokassalasanan yrittämisen, jonka salasananmurtajan on tehtävä tuhansia kertoja. Tätä kutsutaan iteraatioksi, silmukaksi tai muuttuvaksi kustannukseksi. Jotkut salasanan hash-algoritmit käyttävät kovakoodattuja iteraatiokierroksia; Muut Git. Tee se konfiguroitavaksi osassa itse hash-ohjelmaa. Esimerkiksi md5crypt () käyttää MD5: tä, mukaan lukien suola, ja silmukkaa täsmälleen 1000 kertaa. sha512crypt () käyttää sha512:ta, sisältää suolan ja kiertää konfiguroitavan määrän kertoja (oletusarvo on 5 000).
Iteraatiot vaikuttavat pääasiassa hash-algoritmin laskentasyklin kustannuksiin, eivät sen muistin käyttöön tai muihin tekijöihin. Nämä ovat myös tärkeitä hyökkäyksiä, kun suunnittelu on optimoitu vastustamaan tietyntyyppisiä hash-tyyppejä, mutta tämä on liian rikkaruohoa keskustelemaan täällä.
Katsotaanpa joitain esimerkkejä osoittaaksemme hash-algoritmin valinnan vaikutusta, olipa kyseessä sitten suolattu, useiden iteraatioiden käyttö jne. Oletetaan, että hyökkääjä kerää 1000 käyttäjän hash-arvoa jostain tartunnan saaneesta verkkosivustosta, ja he haluavat vain suorittaa yksinkertaisen hyökkäyksen, joka testaa jokaisen salasanan hash-arvon-143 miljoonaa ehdokasta salasanaa.
Tartunnan saaneiden verkkosivustojen käyttämä hash-tyyppi vaikuttaa valtavasti siihen, kuinka kauan hyökkääjän kuluu hyökkäyksen läpi. Tässä on (suhteellinen, suunnilleen) kaavio siitä, kuinka monta sekuntia hyökkäyksen suorittamiseen kuluu, riippuen käytetystä hash-tyypistä, jossa tavallinen näytönohjain:
No, se on turha! Vahvin hash-tyyppi on huomattavasti hitaampi, mutta nopeampi tyyppi on vain litistetty siihen, että ei ole mitään. Kokeillaan samaa datakokoa uudelleen logaritmisella x-akselin ajalla. Kun palkit siirtyvät vasemmalta oikealle, ne lisääntyvät kymmenen voimalla:
Joten muutama tärkeä asia on: Yksittäinen kierros on helpompi kuin useita kierroksia ja suolaton kuin suolan lisääminen, kun haluat murtaa jonkin salasanan hash. Päinvastoin, kun jotkut yritykset tai verkkosivustot ilmoittavat käyttäjätietoja sisältävästä tietovuodosta, a) salasana on parasta hash, ei pelkkä teksti; b) niitä on parasta suolata, ei vain hash; c) Heidän on parempi käyttää tehokasta monikierrosta suolattua hashiä koko ajan, ei vain yksittäistä kierrosta.
Ennen kuin yrität murtaa tietyn salasanan hash, on krakerin tehtävä selvittää, mitä hash-algoritmia sen toteuttamiseen käytetään. Hash-tyypin tunnistaminen on yleensä yksinkertaista, mutta ei aina. Crackerit tekevät usein perusteltuja arvauksia vihjeiden, kuten hash-pituuden ja muodon, perusteella. Loppujen lopuksi ainoa tapa olla varma siitä, että hash-tyypin arvaus on oikea, on se, onko hash murrettu.
Täällä ja täällä on joitain erinomaisia resursseja tähän tehtävään, jotka molemmat osoittavat, miltä yleiset hash-arvot näyttävät.
Kali Linuxissa on saatavilla "hash-identifier"-paketti (saatavilla täältä), joka auttaa tunnistamaan tuntemattomia hash-tyyppejä.
Törmäys tapahtuu, kun kaksi eri tuloa aiheuttaa saman hash-lähdön. Se on paha (ilmeisesti). Salasanojen osalta tämä voi tarkoittaa, etten ehkä murtanut varsinaista salasanaasi, mutta koska löysin syötteen, joka tuottaa saman hash-arvon, voin käyttää tavallista tekstiarvoa huijatakseni järjestelmää ajattelemaan, että salasana on laillinen.
Microsoft Office käyttää asiakirjasuojauksessaan vuosien ajan ristiriitoihin alttiita algoritmia. Ei ole harvinaista löytää useita ristiriitoja yhden hash, jotka kaikki avaavat asiakirjan lukituksen.
Kun ristiriita löytyy, algoritmi rikkoutuu käytännössä. Jos se tapahtuu kerran, on tilastollisesti todennäköistä, että se tapahtuu uudelleen. Ainoa asia, joka estää meitä, on aika ja käsittelykyky. Kun algoritmit muuttuvat vankemmiksi, ehdokasalgoritmien luominen ja hash-tulosten vertailu niiden etsimiseksi vie enemmän kykyä ja aikaa. Tämän seurauksena suunnittelijat ovat yhä parempia luomaan algoritmeja, jotka eivät ole alttiita ristiriitoihin.