Kun tallennat käyttäjän salasanoja, jotka sinun on tarkistettava (mutta joita ei pidä käyttää pelkkänä tekstinä), tekniikan nykytila on seuraava:
- Poista salasana
- Käytä suola
- 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:
- Asiakkaan on haettava suola palvelimelta. Tämä tuo sisäänkirjautumisviiveen, ja ellei ole varovainen, se voi paljastaa, onko tietty käyttäjätili olemassa.
- 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:
- 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.
- 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ä.