Kysymys:
Voiko asiakaspuolen hajautus vähentää palvelunestoriskiä hitailla hajautuksilla?
paj28
2014-05-25 23:31:57 UTC
view on stackexchange narkive permalink

Kun tallennat käyttäjän salasanoja, jotka sinun on tarkistettava (mutta joita ei pidä käyttää pelkkänä tekstinä), tekniikan nykytila ​​on seuraava:

  1. Poista salasana
  2. Käytä suola
  3. Käytä hidasta hajautusfunktiota - bcrypt, scrypt jne.

Tämä tarjoaa parhaan mahdollisen suojauksen hyökkääjää vastaan, joka on varastanut salasanatietokannan. Se ei ratkaise muita asioita, kuten tietojenkalastelua, haittaohjelmia, salasanan uudelleenkäyttöä jne.

Mutta on kuitenkin jäljellä yksi ongelma: hidas hajautus -toiminto voi sallia kieltämisen palvelun hyökkäys. Yksi pyyntö polttaa paljon keskusyksikköä, mikä tekee DOS: n mahdolliseksi suhteellisen pienellä määrällä samanaikaisia ​​pyyntöjä, mikä vaikeuttaa suojausten, kuten IP-kuristus, käyttöä.

Ottaen huomioon JavaScriptin paremman suorituskyvyn selaimissa, se voi nyt olla järkevää tehdä tämä selaimessa. Oletan tässä, että sivusto käyttää SSL: ää, joten JavaScript toimitetaan turvallisesti. Jos et käytä SSL: tä, hitaiden hash-toimintojen käyttäminen ei todennäköisesti ole sinulle ensisijaista. Bcryptissä on ainakin yksi JavaScript-toteutus. Mutta tämän yksinkertainen käyttö tuo mukanaan kaksi ongelmaa:

  1. Asiakkaan on haettava suola palvelimelta. Tämä tuo sisäänkirjautumisviiveen, ja ellei ole varovainen, se voi paljastaa, onko tietty käyttäjätili olemassa.
  2. Jos hajautus tehdään puhtaasti asiakkaalle, hajautusten tallentamisen edut menetetään. Hyökkääjällä, joka on varastanut salasanan tiivisteet, voi yksinkertaisesti kirjautua hashilla.

Uskon kuitenkin, että molempiin ongelmiin on hyväksyttäviä ratkaisuja:

  1. Suola voidaan luoda hash-muodossa (palvelimen_suola + käyttäjänimi) - missä palvelimen_suola on satunnaisluku, joka on yksilöllinen palvelimelle, julkinen ja sama kaikille käyttäjille. Tuloksena olevalla hashilla näyttää olevan tarvittavat suolan ominaisuudet.
  2. Palvelimen tulisi tehdä yksi nopea nopea hajautusoperaatio saamallaan hajautuksella. Esimerkiksi: palvelin tallentaa SHA-256 (bcrypt (suola, salasana)). Asiakas lähettää bcrypt (suola, salasana), sitten palvelin käyttää SHA-256: ta ja tarkistaa hajautusarvon. Tämä EI salli hyökkääjän suorittaa nopeaa offline-hyökkäystä offline-tilassa. He voivat tehdä nopeasti SHA-256: n (salasana) raa'an voiman, koska salasanalla on rajoitettu määrä entropiaa - 2 ^ 50 tai 2 ^ 60 tai niin. Mutta 128-bittisellä salauksella (suola, salasana) on entropia tai 2 ^ 128, joten he eivät voi helposti raakaa sitä.

Onko tämä siis järkevä ja turvallinen lähestymistapa?

Olen tietoinen yleisestä neuvosta "älä tee omaa salaustasi". Tässä tapauksessa yritän kuitenkin ratkaista ongelman, jota ei ole ratkaistu valmiilla salauksilla. John Steven (alan tunnustettu asiantuntija) on tarkastellut tätä perustavanlaatuisen uskottavuuden vuoksi "lyhyellä" analyysillä.

Tarkoitat, että asiakas lähettää `bcrypt (suola, salasana)` ei `bcrypt (salasana)` eikö? (ratkaisukappaleessasi nro 2) Tunne, että kysyn paremmin, vaikka olenkin melko varma
@kajmagnus - joo. Olen nyt matkapuhelimessa; muokkaa kysymystä tietokoneella.
"Tämä EI salli hyökkääjän suorittaa nopeaa offline-hyökkäystä raa'an voiman kautta" On totta, että he eivät voi tehdä nopeaa hyökkäystä salasanan saamiseksi, mutta he voivat tehdä nopean hyökkäyksen saadakseen asian (`bcrypt (suola, salasana)`), jonka he voivat lähettää palvelimelle todennettavaksi.Suurelta osin tämä tarkoittaa samaa.
@rlms - He eivät voi tehdä nopeaa hyökkäystä sitä vastaan, koska se on 128-bittinen ja käytännössä satunnainen
Olet oikeassa, luin väärin ja olin typerä.
Libsodium ehdottaa, että teet juuri tämän, ja tarjoaa keinot tehdä niin: https://libsodium.gitbook.io/doc/password_hashing
@ErwanLegrand - Kiitos, tarkistan sen.Melko alempi LibSodium ei tehnyt sitä, kun kysyin, joten on hyvä nähdä asiat etenemässä.
Kaksi vastused:
Tom Leek
2014-05-26 00:20:06 UTC
view on stackexchange narkive permalink

Palvelimen ja käyttäjänimen käyttäminen suolana (tai sen hashina) ei ole ihanteellista, koska se johtaa suolan uudelleenkäyttöön, kun vaihdat salasanasi (koska pidät nimesi ja puhut silti saman palvelimen kanssa). Toinen menetelmä on saada suola palvelimelta valmisteluvaiheena; tämä tarkoittaa ylimääräistä asiakas-palvelin edestakaista lentoa ja tarkoittaa myös sitä, että palvelimen on vaikeampi piilottaa onko olemassa tietty käyttäjänimi vai ei (mutta sillä ei ole merkitystä käytännössä).

Mitä description on hyvin tunnettu idea, jota yleensä kutsutaan palvelimen helpotukseksi ja jota voidaan soveltaa mihin tahansa salasanan tiivistystoimintoon juuri samalla tavalla kuin kuvaat:

  • Asiakas saa ( tai laskee) suolan.
  • Asiakas laskee hitaasti suolatun hash-arvon V ja lähettää sen salasanana.
  • Palvelin tallentaa h (V) jollekin nopealle hajautusfunktiolle h ja käyttää sitä vahvistaakseen asiakkaan V arvon.

Tämä on turvallinen. Tärkein haittapuoli on, että hidas hajautus tapahtuu asiakkaan nopeudella, joten iteraatioiden määrää voidaan joutua pienentämään, mahdollisesti huomattavasti, jos asiakas on laskennallisesti heikko - kuten kaikessa, joka liittyy Javascriptiin. Jos järjestelmän on toimittava selaimen kanssa ei-niin äskettäisessä älypuhelimessa, iterointiluvun on oltava 10-100 kertaa pienempi kuin mitä palvelimella voitaisiin tehdä, mikä merkitsee vastaavaa vähennystä raakaa voimaa vastaan ​​(in jos hyökkääjä varastaa palvelimelle tallennetut hajautusarvot).

Joten se on kompromissi: koska kiireinen palvelin purkaa työtä asiakkailla, se voi käyttää suurempaa iterointilukua hukkumatta itse kuorman alla; mutta koska asiakkaat ovat heikkoja, iteraatiomäärää on alennettava, yleensä paljon enemmän kuin purkamisen ansiosta; tämä tarkoittaa, että rakentaminen ei ole vaivan arvoista. Yleensä.


Tietenkin, jos asiakkaat ovat laskennallisesti vahvoja, esim. tämä on pelikoneen natiivikoodisovellus, palvelimen helpotus on hyvä idea ja näyttää siltä, ​​kuin kuvaat sitä.

Toinen mahdollisuus on siirtää työ toiselle, kolmannen osapuolen järjestelmälle, esim muut asiakkaat (jo yhteydessä): tämä voidaan tehdä turvallisesti jos hash-toiminto sisältää tarvittavat matemaattiset rakenteet. Tällainen purkaminen tunnetaan nimellä delegointi . Tietojeni mukaan delegointia tarjoaa vain yksi salasanan hajautusfunktio, nimeltään Makwa (katso erittely), yksi nykyisen salasanan huutokilpailun ehdokkaista..

Kiitos ... Minulla ei ollut aavistustakaan, että tätä kutsuttiin "palvelimen helpotukseksi" ja että se on vakiintunut idea. Kaikki sitä koskevat online-viitteet näyttävät liittyvän tähän PHC: hen; oliko ajatus jo etukäteen? (Ehkä sillä oli eri nimi?) Anywya, PHC on erittäin mielenkiintoinen!
Lisäksi sinun on tarkkailtava, ettet vain korvaa salasanan todennusta salasanan hash-of-the-salasanan todennuksella (hashista tulee juuri uusi salasana). Tällöin menetät suojauksen, jonka hash antaa sinulle kadonneiden salasanojen tietokantaa vastaan.
Javascriptin tiivistyskyky voi olla melko hyvä näinä päivinä, hyvin 2x alkuperäisessä koodissa, kun käytetään AsmJS: ää tai Chromea. 32-bittinen viritetty hajautus on pakollinen. Se riippuu siitä, mitä asiakkaita on tuettava.
Vain kaksi kertaa hitaampi Javascript kuin hash-funktion alkuperäinen koodi? Haluaisin nähdä tällaisia ​​vertailuarvoja (tämä olisi jopa nopeampi kuin Java tai C #). Onko sinulla viitteitä?
Tämä on yksityinen toteutukseni, eikä vielä avointa lähdekoodia.
Viitteeni on blake2s: n vs sha256sum linux -apuohjelman yksityinen toteutus. Blake2s hajauttaa noin 70 Mt / s javascriptissä, kun taas sha256sum tekee 80 Mt / s samalla laitteistolla. Blake2s-optimoitu C-toteutus tekee 125 Mt / s. Blake2s SSE suorittaa 200 Mt / s.
@TomLeek Olisit yllättynyt siitä, kuinka nopea JavaScript on näinä päivinä. Tässä on joitain vertailuarvoja, joissa verrataan Clangilla koottuja ASM.js-sovellusten ja Native C ++: n suorituskykyä: http://arewefastyet.com/#machine=28&view=breakdown&suite=asmjs-ubench
"Palvelimen olisi vaikeampi piilottaa, onko tietty käyttäjänimi olemassa", tämä on melko suoraviivaista.Kun palvelimelta kysytään suolaa käyttäjänimelle, se laskee väärennetyn suolan HMAC: n (palvelinsalaisuus, lowecase (käyttäjänimi)) ja etsii sitten tietokannasta kyseisen käyttäjän nimen suolaa.Jos käyttäjänimi löytyy, palauta todellinen suola asiakkaalle.Jos käyttäjätunnusta ei löydy, palauta väärennetty suola.Tämä on vakioaika, nopea ja palauttaa deterministiset suolat jokaiselle käyttäjätunnuskyselylle, joten hyökkääjä ei voi erottaa todellisia käyttäjänimiä.
PwdRsch
2014-05-26 00:23:30 UTC
view on stackexchange narkive permalink

I think the biggest concern about this approach is that it moves a security procedure you've determined is important off of your servers and on to the web browsers of users. While normally everything should work as expected you have no real way to verify that the password was actually hashed with bcrypt before it is sent to you. So if the client-side JavaScript is changed you may still end up with only a SHA256 hash of "123456" on your server.

Sure, you could check the format of data sent from the client to make sure it looks like it was hashed with bcrypt, but you don't know for sure that your desired operation completed.

That's not an ideal security model, but despite that I think the threats to this system are still fairly manageable. And you would be ahead of those sites who either don't hash or hash using plain MD5.

Jos asiakas ei laske hajautusta, tulos on väärä. Palvelimen on vielä laskettava hash salasanaa vaihdettaessa, mutta ei sen vahvistamiseksi.
Jos palvelin luo bcrypt-hashin heti salasanan vaihdon jälkeen, olet oikeassa. En usko, että koska kysymys keskittyy asiakkaalle, joka tekee bcrypt-työtä. Ilman palvelinta astumasta sisään vaatimustenvastainen asiakas voi lähettää salasanan muutosarvon suorittamatta sitä bcryptin kautta, eivätkä myöhemmät todennukset myöskään vaadi sitä.
Anna vain palvelimen laskea oikea hash kerran salasanan vaihdon jälkeen. Tällä tavalla asiakas ei voi koskaan olla tyhmä siitä.
@Gilles Onko tämä todella tarpeellista?Yleensä asiakas on verkkosivu tai sovellus, jonka toimittaa sama yritys kuin palvelin, joten se on yleensä hieno.+++ Jos käyttäjä huijaa asiakkaansa kanssa, se on heidän ongelmansa.He voivat antaa asiakkaan tallentaa hajautetun salasanan.Tämä säästää myös asiakkaan aikaa, se on yhtä epävarmaa kuin se, mitä yrität estää, eikä palvelin tunnista sitä.+++ Jos käyttäjä on tarpeeksi typerä käyttää kolmannen osapuolen asiakasta, niin mitä tahansa voi tapahtua, ja heikomman hashin käyttö on pienin ongelma.+++ Joko puuttuu?


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...