Salasanojen turvallinen tallennus
Mureakuha
Salasanojen tallennuksen riskit
Mikäli käyttäjien salasanat tallennetaan sellaisenaan tietokantaan, mahdollinen hyökkääjä joka on onnistunut tunkeutumaan järjestelmään saa ne selville. Selvin haitta on se, että hyökkääjä pääsee tällöin kirjautumaan järjestelmään anastetuilla salasanoilla, mikäli hänellä oli aikaisemmin pääsy ainoastaan lukemaan salasanatiedot. Vaikka hyökkääjä ilman kirjautumista saisi järjestelmän hallintaansa on selväkielisistä salasanosta edelleen haittaa käyttäjille. Käyttäjä saattaa käyttää samaa salasanaa useammassa paikassa, jolloin hyökkääjä saattaa yrittää käyttää tunnuksia muihin palveluihin. Samasta syystä myöskään palvelun ylläpitäjän ei tulisi saada salasanoja selväkielisinä tietoonsa.
Salasanojen hashaus
Ylläolevan skenaarion estämiseksi salasanat tulisi tallentaa hajautusarvoina (hash), joiden avulla salasanoja ei saada helposti selväkielisiksi ja täten vääriin käsiin. Hajautusarvoja voidaan edelleen vertailla, vaikka niiden "sisältöä" ei saadakaan enää tietoon. Ikävä kyllä kotitietokoneiden tehon kasvaessa ja muistikapasiteetin suurentuessa on ilmestynyt uusia uhkia hash-perustaisille järjestelmille, koska niitä varten voidaan laskea ns. Rainbow-taulukkoja, eli käytännössä esilaskettuja tietokantoja jokaisen mahdollisen kirjainyhdistelmän hashista. Tarpeeksi suurella Rainbow-taulukolla varustautunut henkilö voi murtaa esim. MD5-hashin muutamassa minuutissa.
Tätä menetelmää vastaan on kehitetty ns. suola - järjestelmä, jossa käyttäjän kirjoittamaan salasanaan lisätään niinsanottu suola eli salt, käytännössä noin 2-6 kirjaimen sarja, joka otetaan huomioon myös kirjautumisen oikeellisuutta tarkistaessa. Näin esilaskenta vaikeutuu huomattavasti.
Esimerkki
Alla yksinkertainen esimerkki SHA1-hashien avulla kirjautumisesta PHP-kielellä.
<?php // Käyttäjät ja hashatut salasanat assisosiatiivisessa taulussa $users = array( 'Bob' => '61b204f2a3065ae6f14c0b08453b3118b9d9a519', // Salasanana salakala 'Admin' => 'f43250102b201f9b86b85c066db7e034132bfc5c' // Salasanana aimthIg8 ); // Formista saatu kirjautuminen $user = $_POST['user']; $password = $_POST['password']; if(isset($users[$user]) && $users[$user] == sha1($password)) { // Kirjautuminen onnistui } else { // Kirjautuminen epäonnistui, heitetään poikkeus throw new UserNotAuthorizedException($user); } ?>
