Kysymys:
Miksi ihmiset ajattelevat, että tämä on huono tapa hajauttaa salasanoja?
genesis
2011-07-24 19:27:43 UTC
view on stackexchange narkive permalink

No, kerro mikä vika tässä koodissa on:

  $ password = "hello"; $ password = md5 ($ password); for ($ i = 1; $ i<20 ; $ i ++) {$ password = md5 ($ password);}  

Se on täsmälleen sama kuin tämä:

  md5 (md5 (md5 ( md5 (md5 (md5 (md5 (mD5 (md5 (md5 (md5 (md5 (md5 (md5 (md5 (md5 (mD5 (md5 (md5 (md5 (‌ md5 ($ salasana))))))))))))))) ))))))))));  

enkä usko, että tietokannassani oleva hyökkääjä pystyy purkamaan minkä tahansa salasanan, jonka pituus on> 2.

hyökkääjän on purkaa tähän luetteloon MD5 hash pystyä saamaan selkokielisen salasanan:

  69a329523ce1ec88bf63061863d9cb140dcd649d4ef5f787e39ddf48d8e625a55d6aaee903365197ede6f325eb3716c5cbe8d0c48ab0ed8d23eacb1621f6c5c38fa852c5f5b1d0d6b1cb0fad32596c7191a84cf929b73800d2ff81da28834c6445b7d5e4d3fca6a4868d46a941076b72e5b7d9d10fef132829731255ef644319b3af6ff5f5c7ae757ca816a6cb62f092150f3682b2e58d1d0e1f789f9ba069823f76626950bf31dbc815c667ca4b2b4344f4c75517671e12946aab3c8c293f98442256b098b2d88e9 3428b08b51553087fd8ebc5bdff94f24a10decaa1ab64e8d04bbc863839b720d932a697f0bf443bde737c934db23c2d1d1026863e7583a8d745f6394700c4ab1e9ded0924ea35d2ce9428b51d3a63431c57a435423877b67017f40bdb4f1be1f5fae7dd0fc7b907  

ja bruteforce, hänen tulisi yrittää 36 32 sup> (* 19) yhdistelmä, joka on melko unachivable; vai olenko väärässä? Eikö se ole totta?

Katso myös http://stackoverflow.com/questions/420843/need-some-help-understanding-password-salt
Miksi tämä on huono? 1) Et suunnitellut sitä ennen kuin kirjoitit sen. 2) Virhetarkistuksia ei näytä olevan. 3) Et tarkista salasanan vahvuutta. 4) Et ole määrittänyt kääntäjän tai tulkin asetuksia turvalliseen käyttöön. 5) Et ole toimittanut testivektoreita. 6) Sitä ei ole tarkistettu ja testattu itsenäisesti.
Ei 36 ^ 32. 16 ^ 32. Tarkastelet md5-tiivisteen hex-digestia, joten 32 merkkiä on valittu 16-merkkisestä aakkosesta (0-9, a-f) eikä 36.
@drjimbob: aaah, se on miellyttävämpää kuin luulin! Voisitko lisätä sen vastauksena? Haluaisin hyväksyä sen
@genesis, ei nitpick, mutta huomautin vastauksessani noin kaksi tuntia ennen tohtori jimbobin kommenttia. http://security.stackexchange.com/questions/5586/why-do-people-think-that-this-is-bad-way-to-hash-passwords/5627#5627
koska tarvitset vähintään 21 sisäkkäistä `md5 ()`. se on salauksen kultainen sääntö! (kyllä, minä vitsailen)
Viisitoista vastused:
#1
+76
Thomas Pornin
2011-07-24 20:00:48 UTC
view on stackexchange narkive permalink

Väärät asiat menetelmässäsi ovat:

  • Käytät liian vähän iteraatioita (20 on liian alhainen, sen pitäisi olla 20000 tai enemmän): salasanan käsittely on edelleen liian nopeaa, hyökkääjä perustietokoneella pystyy edelleen "kokeilemaan" kymmeniä miljoonia salasanoja sekunnissa.
  • Suolaa ei ole: hyökkääjä voi hyökätä useisiin salasanoihin erittäin alhaisella salasanakohtaisella hinnalla, esim. valmiiksi lasketuilla hajautettujen salasanojen taulukoilla (erityisesti sateenkaaripöydät).
  • Keksit parhaillaan omaa salaustasi. Ei ole mitään vikaa olla utelias ja yrittää ymmärtää asioita, mutta koska ei ole varmaa testiä siitä, tietävätkö tietyt algoritmit turvallisia vai ei, oman salauksen keksiminen on usein katastrofiresepti. Älä tee sitä.

Sinun tulisi käyttää bcrypt; Portable PHP password hajautusympäristössä on PHP-toteutus.

enemmän iterointeja ei tuota parempaa turvallisuutta. Usein hash, sitä suurempi on hash-törmäysten todennäköisyys. Sanoisin, että md5: n käyttäminen kahdesti olisi parempi kuin md5: n käyttäminen kerran, mutta jos käytät sitä 2, 20 tai 20000 kertaa, sillä ei ole väliä. Sen käyttäminen kahdesti saattaa olla parempi, koska tavalliset murtamisverkkosivustot, kuten http://www.md5cracker.org/, eivät toimi enää.
@moose:-törmäykset eivät ole tässä kysymys - työskentelemme ennen kuvien vastustusta, emme törmäysvastusta, ja se on hyvä, koska MD5 on joka tapauksessa täysin rikki törmäysten suhteen. Tulostilan pienentämistä _voi_ pitää pitää ongelmana, mutta jopa 2 ^ 64 iteraation jälkeen tilan tulisi silti olla kooltaan noin 2 ^ 64; heikkous tässä ei ole MD5, vaan salasana (ts. ihmisen aivot, jotka voivat muistaa salasanan). Useat iteraatiot tekevät _dictionary_-hyökkäyksistä kalliimpia.
Itse asiassa iteraatioiden määrä nykypäivän ohjelmistoissa on paljon suurempi kuin 20000 - joskus jopa miljoonina. Mutta vankka neuvo siitä huolimatta.
@moose,, mikä ei ole oikein. Törmäykset eivät ole tässä huolestuttavia; törmäyksen todennäköisyys tässä yhteydessä on vähäinen (kuten vähemmän kuin mahdollisuudet salaman iskemiseen). Tässä kokeneille parametreille (iteroivat tuhansia, miljoonia tai miljardeja kertoja) enemmän iteraatioita * lisäävät turvallisuutta, ja törmäysten todennäköisyys on vähäpätöinen.
@ThomasPornin Bcrypt on paras vaihtoehto, se ymmärretään, mutta onko uteliaisuudesta (tilanteesta, jota minulla ei ole hallintaa) 50 toistoa SHA-256: ta, jossa suolaus on tehokasta? Miksi tai miksi ei? Taisteleeko sateenkaaripöytiä, ja lisääkö 50 iteraatiota laskennalliset kustannukset?
Aion todella kiistää "Bcrypt on paras vaihtoehto" -vaatimuksen, jonka täällä (@ThomasPornin ja muut) heitetään.Bcrypt on parempi kuin PBKDF2 (joka on vain iteroitu suolaus ja hajautus), koska se vaatii muistia, joka ei ole * täysin * triviaali, mutta silti helppo silti rinnastaa nykyaikaisiin laitteistoihin.RAM on nykyään halpaa.Scrypt tai vielä uudempi Argon2 (voittaja kolmen vuoden kilpailussa parhaasta salasanan hajautusalgoritmista) ovat parempia, koska ne ovat sekä muistikovia että laskukovia ja muistikovuus on viritettävissä (Bcryptin muistikustannukset ovat alhaiset,ja kiinteä).
#2
+34
Gordon Davisson
2011-07-27 06:25:52 UTC
view on stackexchange narkive permalink

Toiset ovat kuvanneet tämän hajautusmenetelmän rajoituksia; Haluan huomauttaa käsitteellisestä virheestä kysymyksessä:

En usko, että tietokannassani oleva hyökkääjä pystyy purkamaan salasanan salauksen, jonka pituus on> 2

Hyökkääjän on purettava tämä md5-hajautusluettelo, jotta se voi saada tavallisen salasanan:

[välitulosten luettelo]

Virhe tässä ajattelussa että välitulosten monimutkaisuus tarjoaa lainkaan suojaa julmien voimien sanakirjahyökkäykseltä. Mielestäni kysyjä ajattelee, että hyökkäyksen on toimittava taaksepäin, alkaen tallennetusta hashista, ja jokaisen välituloksen karkea voima vuorotellen.

Tämä ei ole lainkaan totta; kohtuulliset sanakirjahyökkäykset alkavat mahdollisilla salasanoilla ja hyökkäävät koko 20 hash-pinoa kerralla. Tässä on algoritmin luonnos:

  jokaiselle ehdokassalasanalle: hash 20 kertaa verrattuna tallennettuun hashiin  

Tämän avulla voit tarkistaa kaikki mahdolliset 3-merkkiset salasanat (olettaen tulostettava ASCII) vaatisi vain 20 * 95 ^ 3 = 17147500 hajautusta, mikä on pohjimmiltaan triviaalia. SHA-512: n käyttö MD5: n sijasta, huolimatta siitä, että väliarvot ovat paljon suuremmat, olisi turvallisempaa vain, koska jokaisen hash-laskenta vie vähän kauemmin.

tl; dr monimutkainen hash-toiminto ei voi säästää, jos salasanalla itsessään ei ole tarpeeksi entropiaa.

ja mistä krakkausyksikkö tietää, että hänen on suoritettava hash 20 kertaa?
@Enrique: cracker ei ehkä tiennyt sitä, mutta sinun ei pitäisi luottaa siihen. Tämä on [Kerckhoffsin periaate / Shannonin maksiimi] (http://en.wikipedia.org/wiki/Kerckhoffs%27_principle): Vihollinen tuntee järjestelmän.
OK, mutta sitten on hyvä idea hajauttaa X kertaa vain siksi, että jos cracker ei tiedä X: ää, hänen on vaikeampi murtaa hash. Olenko väärässä?
@Enrique: Ei, se vain pakottaa crackerin vertailemaan jokaisen hashin jälkeen, mikä ei hidasta häntä paljon. Sinun tulisi hajauttaa monta kertaa (tuhansia, ei vain 20), joten krakkausyksiköllä on paljon enemmän työtä tarkistaa kaikki mahdolliset salasanat (katso Thomasin ja Olilandin vastaukset).
@Enrique, Selvyyden vuoksi MD5 on työhön väärä hash. Käyttötapa bcrypt ja toistotoiminnon parametrien säätäminen, kunnes toiminto kestää vähintään 1 ms **. (Ehkä edes "100 ms" ei ole niin iso juttu, jos se tapahtuu vain kerran sisäänkirjautumista kohti) bcryptin käyttö estää oman toistologiikan ja toisen erityisen tärkeän ominaisuuden asentamisen (ellei niitä ole rajoitettu määrä) käyttäjät), mikä tarkoittaa, että jokainen salasana saa oman suolansa, joka vaatii yhden raakaa voimaa käyttävän henkilön kutakin käyttäjää kohti, sen sijaan, että kaikki käyttäjät yhdessä.
#3
+17
oliland
2011-07-24 20:43:30 UTC
view on stackexchange narkive permalink

20x MD5 on nopea hajautusalgoritmi, eli se voi luoda salasanoja hämmästyttävällä nopeudella.

Lopeta nopean hajautusalgoritmien käyttö salasanojen tallentamiseen. Jopa yksittäisten suolojen kanssa; jos jollakin on suora (lue: offline) pääsy tietokantaan, hänet voidaan laskea helposti.

Tässä artikkelissa kerrotaan miksi paljon paremmin kuin minä:

http: / /codahale.com/how-to-safely-store-a-password/

Artikkelissa mainitaan voimakkaasti BCrypt (linkki PHP-kirjastoon), mutta pidä mielessä, että on myös muita sinulle sopivat hitaat hajautusalgoritmit.

edes 19 * 36 ^ 32 yhdistelmää + tuntematon pituus, merkit, suola viimeisessä md5-hashissa on huono?
Käännettävän symmetrisen avaimen algon käyttäminen salasanasi salaamiseen on melkein yhtä huono kuin tietojen tallentaminen selkokieliseen tekstiin. Ikään kuin olisit vaarantanut palvelimen, on hyvät mahdollisuudet, että olet vaarantanut koodin / avaimen tietojen salaamiseksi.
@dvhh - MD5: ää ei voi peruuttaa.
@Ramhound: n vanha aihe, mutta nykypäivän tietokoneilla on mahdollista laskea hash tarpeeksi nopeasti sanakirjaa tai raakaa voimaa vastaan. Jopa ennalta laskettuja taulukoita voidaan testata suolattomilla salasanoilla. Joten kyllä, sitä ei voi peruuttaa, mutta jos olet tarpeeksi motivoitunut, voit selvittää md5: n vastaavan syötteen tarpeeksi nopeasti.
@dvhh artikkelista: "bcrypt on adaptiivinen salasanan hajautusalgoritmi, joka käyttää Blowfish-avaimen aikataulua, ei symmetristä salausalgoritmia."
#4
+11
deceze
2011-07-24 19:33:23 UTC
view on stackexchange narkive permalink

Ongelmana on, että tämä on melko ilmeinen "algoritmi" ja melko nopea käynnistys.
On hyvin todennäköistä, että tälle "algoritmille" on saatavilla ennalta laskettu sateenkaaritaulukko, ja vaikka sitä ei olisikaan, md5 on riittävän nopea voidakseen laskea sen ennakolta realistisessa ajassa.

Käytä aina kullekin salasanalle erillistä suolaa välttääksesi tällaisen hyökkäyksen.

Mutta mitä hyökkääjä tarvitsee saadakseen salasanani nopeasti? Ja kuinka kauan kestää sateenkaaripöydän kanssa?
@gen Jos sinulla on sateenkaaritaulukko "20xMD5" -algoritmille, salasanan haku on välitöntä.
@genesis Kuinka kauan yhden salasanan purkaminen kestää? Tarkista tämä: http://md5hashcracker.appspot.com/
@deceze: onko olemassa tällaista taulukkoa?
@gen En voi antaa sinulle selvää "kyllä", koska en tiedä, mutta mielestäni se on erittäin todennäköistä.
@Chris: Nämä “crackerit” käyttävät vain tunnettujen (* input *, Hash (* input *)) parien hakutaulukkoa.
@deceze: Sateenkaaripöytä, jossa on yli 30 merkkiä. Älä usko, että sitä on olemassa. Ainakin ei täydellinen
@Gumbo. Kyllä se on totta. Mutta pöytä kasvaa ja kasvaa ja kasvaa ...
1. Se, että algoritmi on * "ilmeinen" *, ei ole turvallisuusongelma. 2. Suolan käyttö on hyvä idea, mutta tarvitaan myös enemmän iteraatioita (ja PBKDF2, bcrypt tai scrypt olisi parempi).
@D.W. Se "ilmeinen" meni oikeastaan ​​yhdessä seuraavan lauseen kanssa, että on epätodennäköistä, että tällaiselle algoritmille on jo olemassa sateenkaaritaulukko.
Vaikka se ei olisikaan "ilmeinen", ja vaikka sateenkaaripöytää ei jo olisikaan, se olisi silti huono idea. Jos salasanasi hajautusalgoritmi on mureneva, se, että kukaan muu ei käytä sitä, ei tee kunnosta käyttää karkeaa algoritmia.
@D.W. Ja olen täysin samaa mieltä siitä, jos se ei ollut selvää.
#5
+10
a CVn
2011-07-25 17:30:58 UTC
view on stackexchange narkive permalink

Sen lisäksi, mitä muissa vastauksissa on jo todettu, minusta näyttää siltä, ​​että sinulla on perusteellinen väärinkäsitys istumassa juuri kysymyksessäsi. 128-bittisen hash-toiminnon, kuten MD5, lähtöalue ei ole 36 ^ 32 (noin 6.3e49), mutta 2 ^ 128 (noin 3.4e38). Se on 11 suuruusluokkaa!

Salaus on vaikeaa. Jos et tiedä tarkalleen, mitä teet (ja monissa tapauksissa, vaikka tiedätkin), olet paljon, paljon parempi, jos et yritä suunnitella jotain itse vaan käyttää valmiita, kokeiltu ratkaisu. Saat tosielämän esimerkin siitä, kuinka kauheasti väärät asiat voivat mennä, kun et tiedä tarkalleen mitä olet tekemässä, etsimällä Debian OpenSSL -avaimen vika. Netscape PRNG: n varhainen versio on toinen esimerkki. Olen varma, että myös muita on enemmän tai vähemmän laajasti julkistettu.

#6
+9
Joel Coehoorn
2011-07-24 23:51:55 UTC
view on stackexchange narkive permalink

Md5: n vain toistamiseen uudestaan ​​ja uudestaan ​​on neljä ongelmaa, riippumatta siitä kuinka monta kertaa teet sen.

Laskentateho ajan myötä

Ensimmäinen iso ongelma tässä on, että kirjoitettu, se ei laajene ajan mittaan pysyäkseen turvassa, kun tietokoneet nopeutuvat. Se, mikä on tänään turvallista, hajoaa hetkessä huomisen tietokoneissa.

Moderneilla suojatuilla algoritmeilla, kuten bcrypt ja scrypt, on sisäänrakennettu viritys niin, että algoritmi voidaan säätää automaattisesti hitaammaksi hyökkäävien tietokoneiden nopeammin. Koska bcrypt on myös ilmainen ja se on silti vain yksinkertainen toimintokutsu sinulle, ei ole mitään hyvää syytä olla käyttämättä sitä.

Sinulla on nyt skaalausrakenteen alku sisäänrakennettu koodiin. Olisi helppo refraktoida, että md5-hajautusaseman suorittaminen mielivaltaisen määrän kertoja, jotta voit virittää sen hitaammaksi ajan myötä. Mutta se ei ole tarpeeksi hyvä.

Suunniteltu epäonnistumiseen

Toinen ongelma on, että md5 on pohjimmiltaan huono valinta salauksen hashille, koska se on suunniteltu erityisesti nopeaksi . MD5: n tarkoituksena on tarkistaa tai verrata nopeasti suuria tiedostoja. Tämän saavuttamiseksi hash on voitava laskea nopeasti ja tehokkaasti. Tämä tarkoittaa, että algoritmin toteutus ja suunnittelutavoitteet ovat täysin ristiriidassa salasanojen tallentamisen kanssa. Mahdollisuudet jossain vaiheessa selvittää tapa laskea md5-hash, joka on suuruusluokkaa nopeampi kuin mitä voimme tällä hetkellä tehdä, ovat suuruusluokan suurempia kuin pystymme tekemään saman sha1: lle tai bcryptille. p>

Rappeutuminen

Kolmas ongelma on, että hajautusalgoritmeilla on taipumus , kun ne toistetaan. Ota tämä ymmärtämään käyttäjän toimittama alkuperäinen teksti. Tämän tekstin käsitteellinen koko on rajoittamaton . Tässä on ääretön määrä mahdollisia arvoja. Kun olemme hajauttaneet tekstin kerran md5: llä, olemme saavuttaneet 2 128 -määrää mahdollista arvoa ... silti hyvin suuri, mutta ei enää rajaton. Mutta kierretään tämä uudelleen. md5 on hyvä, mutta se ei ole täydellinen . Näillä 340 undecillion: n potentiaalisilla panoksilla on törmäyksiä ja ne tuottavat useita tuloksia, jotka ovat lähellä, mutta silti jonkin verran vähemmän kuin 2 128 . Jatkamalla iterointia löydät lisää törmäyksiä, kunnes lopulta päädyt numeroon, joka on edelleen suuri, mutta on huomattavasti pienempi kuin käsitteellinen tila, jonka luulit työskentelevän.

Syklit

Lopuksi neljäs ongelma on, että jotkut alkuperäisistä potentiaalisista panoksistasi johtavat sykleihin : arvon numero 12345 hajautus 98743: een, joka hajaantuu 67321: een, joka hajaantuu takaisin 12345: een jne . Toisin sanoen jotkut syötteet käyvät läpi saman pienen hajautusarvojen joukon, ja niiden toistaminen edelleen ei auta . Itse asiassa, mitä enemmän kertoja suoritat hajautuksen, sitä todennäköisemmin tietty alkuperäinen tulo päätyy jaksoon.

Tämä palaa md5: n suunnitteluun. Salaus hash voitaisiin suunnitella minimoimaan (ei kokonaan eliminoimaan, mutta ainakin minimoimaan) rappeuma ja syklin ilmiöt, mutta se ei ollut lainkaan huolenaihe md5: lle.

Päätelmä

Jokainen näistä syistä yksin riittää käyttämään md5: tä. Saatavilla on muita täysin hyviä vaihtoehtoja, ja ne käyttävät yleensä samaa käyttöliittymää, joten toisen valitseminen ei ole vaikeaa. Joissakin käyttöympäristöissä se on yhtä helppoa kuin siirtää jollekin "createhash" -toiminnolle välitettävä enum-arvo. Laita kaikki kolme syytä yhteen, ja md5: n käytön jatkaminen on täysin hullua.

Viittaus väitteisiin, joiden mukaan MD5: tä ei ole suunniteltu huolta rappeutumisesta tai syklistä?MD5 on ehdottomasti suunniteltu salauksen hash-toiminnoksi.Sitä pidetään rikkoutuneena (törmäykset ovat helppoja, vaikka sen kuvankestävyys onkin pysynyt kohtuullisen hyvin), mutta väittäen, että `` kryptografinen hajautus voidaan suunnitella minimoimaan rappeuma ja sykli ilmiöitä [sic], mutta se ei ollut lainkaan huolenaihe md5: lle`tarvitsee varmuuskopion.
#7
+7
Wedge
2011-07-25 07:56:57 UTC
view on stackexchange narkive permalink

Sinulla on yksinkertainen yksisuuntainen hajautustoiminto salasanoille, näyttääkö turvalliselta, eikö? Sinun on käytävä läpi paljon arvauksia, jotta voisit raakaa tällaisen järjestelmän. Harkitse kuitenkin huono tapaus (ei edes pahin tapaus). Käytät tätä suojaustasoa erittäin tärkeällä sivustolla tai jopa sivustolla, jolla on paljon käyttäjiä.

Sitten eräänä päivänä siellä on pieni tietoturva-snafu tai sivustollasi on aiemmin tuntematon haavoittuvuus, jota hyödynnetään. ja kaikki käyttäjätilisi tiedot, mukaan lukien hajautetut salasanat, ovat nyt "pahojen" käsissä. Pahat pojat menevät edulliseen tietokoneeseensa, jossa on kunnollinen GPU, ja muokkaavat aiemmin olemassa olevaa ohjelmaa tuottamaan hajautuksia niin, että se tekee 19-tasoista md5-hajautusta. Sitten he syöttävät sille hyvin hiotun sanakirjan tavallisista ja todennäköisistä salasanoista sekä satunnaisista aakkosnumeerisista merkkijonoista, joiden pituus on kasvava. Ajan myötä grafiikkasuoritin pyörii luomalla hajautuksia luomalla hakupöydän. Pahat pojat voivat milloin tahansa tarkistaa luomansa hajautushakutaulukon hajautettujen salasanojen luettelosta ja koska et käyttänyt salasanasuolaa, löytävät helposti vastaavuudet. Ajan myötä, kun grafiikkasuoritin jatkaa työtä, yhä useammat salasanat paljastuvat, kunnes vain vahvimmat salasanat ovat jäljellä.

#8
+6
dr jimbob
2011-07-25 23:03:08 UTC
view on stackexchange narkive permalink

MD5 ei ole nykyään paras hash, jota nykyään voidaan käyttää turvallisuudessa; hashit voidaan laskea liian nopeasti (vaikka md5: n suurin virhe on törmäysten syntymisen helppous). Sen vain 128 bittiä (16 ^ 32 = 2 ^ 128 ~ 10 ^ 38); kokeile sha-256 (2 ^ 256 ~ 10 ^ 77; sen 2 ^ 128 kertaa enemmän näppäimiä) tai sha-512. Avaimen vahvistaminen on hyvä käytäntö (esim. Sateenkaaripöydän luominen kestää 20 kertaa kauemmin); mutta silti 20 kertaa pidempi ei ole niin pitkä (esim. käytä 20 konetta ja se kestää yhtä kauan), mutta se tehdään parhaiten satunnaisella suolalla. Olisi paljon parempi näppäillä vahvistus sanoa 100000 kertaa.

  $ password = "hello"; $ salt = random_str (); // generoi suhteellisen lyhyt satunnainen str $ password = sha256 ($ password); for ($ i = 1; $ i<100000; $ i ++) {$ password = sha256 ($ salt + $ password);} $ sep = "|" ; $ password_scheme = "SHA256x100k"; $ password = $ salt + $ sep + $ password_scheme + $ sep + $ password;  

Pseudokoodikielen käyttäminen, jossa + ketjuttaa merkkijonoja ja random_str () on funktio, joka tuottaa lyhyen satunnaismerkkijonon. Satunnaisen suolan tarkoitus on, että jos hyökkääjä näkee lähdekoodisi, näkee salasanasi hajautukset, heidän on tehtävä erillinen sateenkaaritaulukko kullekin eri suolalle (tai yksi kullekin salasanalle). Joten nyt sen sijaan, että heidän tarvitsisi vain luoda yksi sateenkaaritaulukko kaikkien käyttäjien salasanojen saamiseksi, heidän on luotava sateenkaaritaulukko saadakseen vain yhden salasanan. On myös hyvä dokumentoida salasanamalli hashissa, joten voit päivittää sen tarvittaessa, esimerkiksi siirtyä SHA256x100k: stä SHA256x1k: ksi, jos sinun on oltava vähemmän keskusyksikköä kuluttava tai päätät siirtyä toiseen hashiin myöhemmin.

Ei ole parasta ajatella omaa salaustapaa, jos et ole salauksen asiantuntija. Jätät ehdottomasti mahdollisuuden hienovaraisiin tietoturva-aukkoihin, kuten ajoitushyökkäykset, jopa näennäisesti turvallisilla algoritmeilla. bcrypt on luultavasti paras panoksesi.

Huomaa: MD5 on erityisen alttiina törmäyshyökkäyksille, mutta sinun ei tarvitse huolehtia törmäyksistä ennen kuvakohtauksia (mikä on tapa hyökätä salasanan hajautuksia vastaan). Hyökkääjä sai jotenkin luettelon salasanan hajautuksista (h) ja oppi hash-rutiinin (md5 x 20 tai suolattu sha256 x 100k) ja yrittää saada minkä tahansa viestin m, joka hash_routine (m) = h, päästämään heidät järjestelmään.

Mikä törmäyshaavoittuvuus saa sinut huolestumaan, on se, että jos sinulla on hash (m1) = hash (m2), kun m1! = m2; Joten jos lataat jotain, josta ihmiset ovat tarkistaneet, että tiedosto m1 on turvallinen ja haluat varmistaa, että olet todella ladannut m1: n, verrataan hash (m1) julkiseen md5 hashiin. Jos siellä on haitallinen versio m2, jolla on sama md5-hash, et voi olla varma, että m1 on turvallinen tarkistamalla sen md5-summa.

Mahdollisuudet ovat, että sisääntulon entropia (salasanassa) on pienempi kuin hash-funktion raakaa tulostetilaa, joten hash-toimintojen * vaihtaminen * vain * tuotoksen hash-koon takia ei aio muuttaa dramaattisesti tietoturvaa.
@Michael, Olen samaa mieltä. SHA-256/512: n ensisijainen etu on, että se on hitaampi. Päästäksesi 128-bittiseen entropiaan tarvitset monimutkaisen salasanan, kuten 22 satunnaista merkkiä 62-merkkisestä näppäimistöstä; esim. pvLfXpJ4qbgSEBohcmZyvz; 8 merkin salasanalla olisi vain ~ 47 bittiä suojausta (ja tarvitset 43 merkkiä 256 bitille). Vaikka se on todennäköisesti varotoimenpide, joillekin suojatuille sovelluksille ihmiset saattavat haluta käyttää hulluja salasanoja, ja levytilan kustannuksilla ei nykyään ole syytä tallentaa tavuja. (Esim. Kryptassa / etc / shadow on yleensä käytössä sha-256/512 nykyään).
#9
+5
Jeff Ferland
2011-07-24 20:56:17 UTC
view on stackexchange narkive permalink

Sateenkaaritaulukot toimivat, koska useat järjestelmät käyttävät samankaltaisia ​​järjestelmiä tietojen käsittelyyn. Vaikka pidetään hyvänä, että suolan lisäämisen pitäisi olla salasanan hajautuksen yleinen ominaisuus, useiden kierrosten lisääminen auttaa myös voittamaan sateenkaaripöydät. Tarkkuus: MD5: n minkä tahansa merkkijoukon sateenkaaritaulukko ei voi johtaa järjestelmän salasanan vastaavuuteen, paitsi vahingossa tapahtuvassa törmäyksessä. Sateenkaaritaulukon pelkistystoiminto muuntaa jokaisen luodun hash-merkkijonon merkkijonoksi, joka vastaa taulukon suunnittelemaa kirjainta, numeroa ja symbolikuviota. Tällä hetkellä, kun menetelmällä luodaan hajautusarvo, joka sisällyttää symbolin kyseisen alueen ulkopuolelle (virtuaalinen varmuus siitä, että hash-funktion tulo on hajautusarvo), se estää taulukkoa toimimasta.

Sillä, että järjestelmäsi on yksinkertainen tai jopa julkisesti tunnettu, ei ole väliä niin paljon kuin sateenkaaripöydän voittaminen vaatii vain, että hasiasi ei voida luoda paljon taulukon luomiseen käytetyllä menetelmällä.

Wikipedia on käsitellyt hajautusvoiman kysymystä ajan myötä, koska heidän käyttäjätietokantansa on tunnettu, hyvin vanha ja käyttänyt erilaisia ​​hajautusmenetelmiä, jotka ovat nyt epävarmoja. Käsitelty ratkaisu oli keskeinen ulottuvuus useiden menetelmien välillä. Salasanan laskemiseksi siellä haetaan hash-menetelmäversio ja sen mukaan laskettu salasana. Kun kirjaudut sisään vanhalla versiolla, se päivitetään uudempaan versioon.

Thomas mainitsi, että sinun tulisi käyttää useampia kierroksia hajautukseen. Siitä, josta ei ole puhuttu, määritetään kuinka monta kierrosta käytetään. Vastaus tähän on sumea, mutta periaatteessa se kertoo: "Kuinka monta iteraatiota voin suorittaa järjestelmän kirjautumiskuormitukselle?" Jos sinulla on 10000 käyttäjää kirjautumassa sisään joka minuutti, saatat olla halukas omistamaan 25% prosessorikuormituksen siihen. Valitse sitä varten useita iteraatioita, joiden avulla voit tehdä noin 700 laskutoimitusta sekunnissa.

Henkinen harjoitus sen selvittämiseksi, kattaako sateenkaaripöytä 25 hash-iteraatiota järjestelmässä, jolla on 20 hash-iteraatiota, sisältää henkistä työtä, jota en ole valmis tekemään sunnuntaiaamuna, mutta jos joku haluaa soittaa ajatusta, niin d arvostaa.
Sateenkaaripöytä voi maksaa vain, jos hyökkäät tiettyyn salasanan hajautusalgoritmiin useammin kuin kerran. Pelkistystoiminnolle käytetty aika ja menetetty aika päällekkäisyyksien muodostamiseksi tekevät peräkkäisestä arvaamisesta tehokkaamman ja todennäköisemmin onnistuneen (prosenttiosuus hasheista, joita suunnittelu ei koskaan saavuttanut).
Sateenkaaripöydistä on hyötyä, kun haluan murtaa salasanat yhdelle koneelle, sitten haluta murtaa salasanat toisella koneella myöhemmin ja käyttää sitä levylle kirjoitettua ajanvaihtoa varten. Jos aion käyttää sitä vain kerran (tai jopa 2-3 kertaa ketjujen tuottamattomuuden vuoksi), ei ole sen arvoista rakentaa ensin koko taulukkoa. Etu saman hashin useista esiintymistä ilmenee vain, kun niitä hyökätään eri ajankohtina. Mitä mainitsin viimeisessä kommentissani, etsin yksinkertaista hakua, jota käytettäisiin tavallisessa raakassa pakottamisessa.
Jeff, OK, ymmärsin aiemmin väärin, mitä yritit sanoa. Anteeksi. Ehkä se, mitä yrität sanoa, on se, että jos kukaan muu ei ole rakentanut sateenkaaripöytää tälle hash-menetelmälle, en voi käyttää uudelleen jonkun toisen työtä sateenkaaripöydän ennakkolaskennassa. OK tajusin. Mielestäni on edelleen harhaanjohtavaa päästä eroon tästä väitetystä edusta, kun järjestelmällä on niin paljon vakavampia turvallisuusongelmia. Ja (erillinen numero) En ole varma, onko olemassa olevien sateenkaaripöytien uudelleen käyttäminen mahdotonta (kuten ehdotat), tai että on hyvä ottaa käyttöön suojausmekanismi olettaen, että vain yksi järjestelmä käyttää sitä.
Aivan. Minun täytyy palata takaisin ja muotoilla vastaukseni muutaman seuraavan päivän aikana, koska se aiheutti ilmeisesti sekaannusta (oikeassa ei ole väliä, jos joukko ihmisiä tietää ei ymmärrä mitä sanoin). Hyvä keskustelu tavallaan.
#10
+4
Frog
2011-07-24 19:47:22 UTC
view on stackexchange narkive permalink

Ei, olet väärässä. MD5-tiivisteiden ongelma on se, että törmäyksillä on suhteellisen suuri mahdollisuus: on olemassa useita merkkijonoja, jotka tuottavat saman hash-koodin. Ja koska on vain 36 ^ 32 mahdollisuutta, jotka kaikki voidaan kokeilla noin 35 tunnissa, uskon (ja se saa tuloksen nopeammin, koska törmäyksille on suuri mahdollisuus), sitä ei enää pidetä hyvänä hashina. Puhumattakaan siitä, että sateenkaaripöytä on todennäköisesti olemassa 20 md5 hashille. Lisäksi on ihmisiä, jotka sanovat, että md5 on todella palautuva, mutta en ole siitä varma.

Voit tehdä salasanoistasi vaikeampaa hakkeroida kahdella tavalla:

  1. Käytä staattista suolaa. Tämä tekee pohjimmiltaan sateenkaaripöydistä tehottomia, koska hakkeri ei voi enää käyttää vain englanninkielisiä sanoja, koska suolasi (jota hakkeri toivottavasti ei tiedä) muodostaa suuren osan merkkijonosta. Kokeile pitkiä suoloja, jotka koostuvat monista erikoismerkeistä.
  2. Käytä parempaa, pidempää hajautusalgoritmia, kuten poreallas tai sha512. Tämä lisää selvästi suuresti mahdollisuuksien määrää;
  3. Hajaa merkkijonosi useita kertoja (x). Tämä on yksi niistä asioista, jotka olet tehnyt oikein: jos hakkeri tietää suolasi ja kuinka monta kertaa sinulla on hashia (joten pääsääntöisesti sinulla on pääsy lähdekoodiin ja tietokantaan), tämä varmistaa, että tulosten saaminen vie x kertaa pidempään ;
  4. Luo merkkijonosta riippuva suola. Tämä on suola, joka syntyy satunnaisesti jokaiselle merkkijonolle, jonka tallennat tietokantaan ja tallennetaan sen mukana. Tämä varmistaa, että hakkerin on silmukoitava jokaisen salasanan kaikki hash-mahdollisuudet sen sijaan, että se voisi tehdä sen kerran jokaiselle tallentamallesi salasanalle. Jos tietokantaan on tallennettu 500 salasanaa, hakkeri vie 500 kertaa kauemmin kaikkien salasanojen hakkerointi.

Toivottavasti tämä auttoi. :)

Anteeksi, en ajatellut 20x hajautettua md5: tä, joten se ei ole 36 ^ 32 vaan 19 * 36 ^ 32 + tuntematon pituus, merkit, suola viimeisessä md5 hashissa. Olenko oikeassa?
Tarkoitatko sitä, että luulet mahdollisuuksien määrän kasvavan, kun sinulla on enemmän hashia? Ei, se ei ole totta: Mahdollisuuksia on 36 ^ 32, koska se on vain määrä erilaisia ​​merkkijonoja, jotka saat 32 merkin pituudesta. Joten 20 kertaa sekoittaminen ei suojaa törmäyksiltä, ​​mutta se varmistaa, että hakkereilla kestää kauemmin kokeilla kaikkia mahdollisuuksia. Siksi se on sitä parempi.
Uh. MD5-hashissa (heksadesimaalimuodossa) on 32 heksadesimaalimerkkiä (16 vaihtoehtoa - 0-9 ja a-f). Joten 16 ^ 32 = 2 ^ 128 ~ 3,4 x 10 ^ 38 ainutkertaista md5-tiivistettä, ei 36 ^ 32 (oletan, että luulit 10 numeroa, 26 merkkiä). Jos sinulla on kokoonpano, jossa on miljoona prosessoria, joista kukin voi tuottaa hajautuksia miljardille syötteelle sekunnissa, hajautusten luominen kaikille 2 ^ 128 md5 -tyylisille alkuajoille vie silti ~ 10 ^ 16 vuotta. Olisi paljon parempi saada vain luettelo todennäköisistä salasanoista (tällainen luettelo on paljon lyhyempi (sanoa 10 ^ 12 salasanaa) ja klusteri voisi luoda tarvittavan sateenkaaritaulukon muutamassa sekunnissa).
@Frog, vastauksessasi on useita virheitä. Väitteesi törmäyksistä ei ole oikea: tässä sovelluksessa törmäyksen mahdollisuus on vähäinen. Vastauksessasi on myös muita virheitä (esim. 36 ^ 32 ei ole oikea; sha512: n tai porealtaan käyttämisellä ei ole paljon eroa, eikä hajautusfunktion ulostulon pituudella ole merkitystä; staattinen suola ei ole hyvä idea, sen sijaan sinun tulisi käyttää satunnaissoola, joka on valittu itsenäisesti jokaiselle hajautetulle salasanalle.
@D.W .: Pienelläkin parannuksella on merkitystä, joten on aina parempi käyttää sha512: ta tai poreallasta md5: n sijaan. Mielestäni staattisen suolan käyttö on hyvä idea, koska siten hakkeri tarvitsee pääsyn sekä lähdekoodiin että tietokantaan, kun taas muuten pääsy vain tietokantaan on tarpeeksi hyvä.
@Frog, ei, se on väärä. 128-bittisen ja 512-bittisen hash-lähdön takia ei ole merkityksellistä suojauseroa. Se ei ole edes pieni parannus; parannus on tilastollisesti erotettavissa nollasta. Väite * "Tämä lisää ilmeisesti huomattavasti mahdollisuuksien määrää" * on yksinkertaisesti väärä. Mitä tulee suolaan, jos sinulla on käyttäjäkohtaista suolaa, staattisella suolalla ei ole lisäarvoa. Jos sinulla ei ole käyttäjäkohtaista suolaa, olet pulassa, ja staattinen suola ei vie sinua ongelmista. Joten kummallakaan tavalla staattinen suola on hyödytön.
#11
+2
Gumbo
2011-07-24 19:53:22 UTC
view on stackexchange narkive permalink

Yleensä ei ole mitään vikaa, jos hajautat arvon useita kertoja, jotta se olisi vankempi raakoja voimahyökkäyksiä vastaan. Itse asiassa tämä on jo käytetty tekniikka, joka tunnetaan nimellä avainten venytys.

Ainoa vastalauseesi esimerkillesi on, että sinun tulee käyttää kryptografisesti vahvaa hajautusalgoritmia sekä hajautusjärjestelmä, joka sisältää suolaa entroopiasta ja vastustuskyvystä sateenkaaripöytähyökkäyksille. Parhaimmillaan jo todistettu salasanojen tallennusjärjestelmä, kuten crypt, joka on suunniteltu erityisesti salasanoille.

#12
+2
yfeldblum
2011-09-28 06:38:37 UTC
view on stackexchange narkive permalink

En usko, että hyökkääjä ... pystyisi

Oletat tietäväsi, miten hyökkääjät toimivat.

Oletat tiedät kaikki hyökkääjien käyttämät temput ja olet puolustanut menestyksekkäästi kaikkia niitä vastaan.

Oletat, että julkaistussa tutkimuksessa ei ole mitään tietoa, joka on kaikkien oppimisen kannalta kiinnostavien käytettävissä, se voi auttaa jopa kohtalaisen ammattitaitoista hyökkääjää rikkomaan turvallisuutesi.

Oletat, että hyökkääjä ei halua edes tehdä raakavoimaista hyökkäystä varastetulla laskennalla. (Oletko harkinnut skenaariota, jossa hyökkääjä on kärsivällinen ja kehittää taustatyötä jonkun toisen palvelimelle, palvelimelle, johon hyökkääjä murtautui ja jota ei makseta, salasanatiedoston murtamiseksi kuukauden ajan ?)

Tämä on yleensä erittäin huono oletus.

#13
+1
goodguys_activate
2011-10-31 20:58:47 UTC
view on stackexchange narkive permalink

Liittyvät linkit:

#14
  0
Ibu
2011-09-28 04:36:24 UTC
view on stackexchange narkive permalink

Ymmärrän, että tämä kysymys on ollut jo täällä jonkin aikaa, ja siihen on erinomaisia ​​vastauksia. Kuinka ikinä uskon, että on yksi ongelma, jota ei ole käsitelty. Vahvan algoritmin (kirjastosta) käyttäminen on oikea tapa edetä, koska nuo menetelmät on testattu. Mutta näen tämän:

En usko, että tietokannassani oleva hyökkääjä kykenisi purkamaan minkä tahansa salasanan, jonka pituus on> 2

ongelma ei ole luoda kaikkein mahdottominta algoritmia salauksen purkamiseksi. Ongelma on tietokannan suojaaminen. Esimerkiksi jos hyökkääjällä on hallussaan tietokanta, en usko, että hän välittää paljon sen salasanoista.

Itse asiassa salasanoja käytetään usein uudelleen useiden verkkosivustojen välillä. Joten yhden verkkosivuston salasana on hyödyllinen paitsi tälle verkkosivustolle, myös muille.
#15
-5
dvhh
2011-07-25 07:42:22 UTC
view on stackexchange narkive permalink

Menetelmän ongelmana on, että jokaisella md5-puhelulla suurennat salasanojesi törmäystilaa ( ei matematiikan todisteita siitä, vain naiivi ymmärtäminen ). Niin siistiltä kuin se näyttääkin, älä yritä tehdä tietoturvasta monimutkaisempaa kuin se tarvitsee.Ketjujen hajautusalgo on yhtä hyvä kuin käyttää useita näennäissatunnaisia ​​yrittää luoda turvallinen satunnaisuus. Voit saada yksinkertaisen turvallisuuden, joka on riittävän turvallinen, jos noudatat järkeä.

Joka tapauksessa tavallisia neuvoja esiintyy, käytä suolaa käyttämällä hajautusalgoa, jolla on riittävän suuri törmäystila. Jos haluat lisää turvallisuutta, sinun on harkittava niitä muilla tasoilla, kuten palvelinten suojaus, henkilöstön turvallisuuden hallinta.

Joka tapauksessa, jos haluat käyttää muita neuvoja bcryptin ( joka on niin huono kuin vaatii) käytöstä saat avaimen salaamaan koko salasanaluettelon [ O (n) heti, kun olet saanut salasanan], eikä sateenkaaren taulukkoon katsomista kutakin merkintää vastaan ​​[ O (n * m) ]), suosittelen ainakin, että käytät julkisen avaimen salakirjoitusta , koska avain tietojen salauksen purkamiseen ei tarvitsisi syöttövahvistuksessa (käytä avainta salaamaan samalla tavalla kuin hajautat tietojasi.).

bcrypt ei ole symmetrinen salausmekanismi. Se on yksisuuntainen salasanojen tallennusjärjestelmä, joka satunnaisesti käyttää symmetristä lohkosalausta toteutuksessa. Jos haluat tarkistaa salasanan bcryptillä, et pura mitään. Ketjujen tiivistäminen on hienoa, eikä se suurenna törmäystilaa.


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...