Wachtwoorden hashen? Wettelijk verplicht!

Door Gtoniser op donderdag 7 augustus 2014 12:06 - Reacties (19)
Categorie: Algemeen, Views: 5.939

Nodig?
"Ja, Joomla slaat de wachtwoorden standaard beveiligd op, maar dat vinden we niet handig dus slaan we ze ook als plaintext op"
Tijdens een gesprek met een klant kwam deze opmerking afgelopen week langs. Ja, een wachtwoord plaintext opslaan kan soms handig zijn, maar een beetje webdeveloper weet wel dat zulke dingen niet door de beugel kunnen.
Het excuus wat ik wel eens langs hoor komen is dat de dienst toch niet zo belangrijk is, en mensen hooguit een wachtwoord voor die dienst buit kunnen maken.
Fout.
Veel mensen gebruiken standaard dezelfde wachtwoorden, en als ik een kwaadwillende "hacker" ben en ik heb jouw email en wachtwoord, dan ga ik deze natuurlijk als eerste proberen op je email account, facebook, etc

Verplicht!
Wat veel mensen niet lijken te weten is dat het goed beveiligen van wachtwoorden in Nederland wettelijk is verplicht. In Nederland hebben we namelijk te maken met de Wet Bescherming Persoonsgegevens.
De text van deze wet kun je hier vinden. Het artikel in toepassing is artikel 13:
quote: WBP
De verantwoordelijke legt passende technische en organisatorische maatregelen ten uitvoer om persoonsgegevens te beveiligen tegen verlies of tegen enige vorm van onrechtmatige verwerking. Deze maatregelen garanderen, rekening houdend met de stand van de techniek en de kosten van de tenuitvoerlegging, een passend beveiligingsniveau gelet op de risico's die de verwerking en de aard van te beschermen gegevens met zich meebrengen. De maatregelen zijn er mede op gericht onnodige verzameling en verdere verwerking van persoonsgegevens te voorkomen.
Wat betekent dit nou in de praktijk? Het orgaan wat toezicht houdt op deze wet, het College Bescherming Persoonsgegevens (CBP) heeft een handig document hierover: http://www.cbpweb.nl/down...ging-persoonsgegevens.pdf
Hoewel het woord "richtsnoeren" misschien wat lijkt op aanbevelingen, moet je dit niet zien als een voorbeeld, maar als de invulling van de wet waar je je aan dient te houden.
In het hoofdstuk over het hiervoor genoemde Artikel 13 vinden we onder andere het volgende:
quote: CBP
Naast de beveiliging van persoonsgegevens ziet artikel 13 Wbp ook op de toepassing van privacy enhancing technologies (pet)
(...)
pet is de verzamelnaam voor een aantal technieken die de verantwoordelijke kan toepassen om bij het verwerken van persoonsgegevens de risico’s voor de betrokkenen te beperken.
Even verder vinden we wat voor regelgeving deze pet inhoudt:
quote: CBP
Bij het onderzoeken en beoordelen van de naleving van de wettelijke verplichting tot het toepassen van pet hanteert het cbp als uitgangspunt een aantal gangbare pet maatregelen. Deze maatregelen zijn:
• Encryptie (versleuteling) en hashing
De verantwoordelijke maakt gebruik van cryptografische bewerkingen om de persoonsgegevens
die hij verwerkt te beveiligen. Hij past encryptie (versleuteling) toe bij verzending van persoonsge­
gevens via het internet, bij de opslag van persoonsgegevens op draagbare apparatuur en op verwij­derbare media zoals usbsticks en in andere situaties waar persoonsgegevens kwetsbaar zijn voor toegang door onbevoegden (bijvoorbeeld persoonsgegevens die via het world wide web kunnen worden benaderd). Bij de opslag en verwerking van wachtwoorden maakt hij gebruik van hashing. Bij het toepassen van cryptografische technieken past hij alle gangbare voorzorgsmaatregelen toe, zoals goed ingericht sleutelbeheer en het gebruik van sleutellengten en versleutelingstechnieken die in overeenstemming zijn met de actuele stand van de techniek.
Voor de duidelijkheid, dit betekent dat dingen als
PHP:
1
2
$hash = md5($password);
$hash = sha1($password);

NIET voldoende zijn.
Deze technieken zijn hopeloos verouderd, met een beetje moderne videokaart kun je zo'n 10.000 Miljoen tot 20.000 Miljoen hashes per seconde testen (bron).

In de praktijk
Wat is dan wel een goede beveiliging voor wachtwoorden in een database?
Een goede hash voldoet tenminste aan de volgende punten:
- Een random salt
- Een sterk algorithme (blowfish, sha256, sha512, etc)
- Voldoende encryptie rondes

Er zijn voldoende sites die dit verder uitwerken. Een voorbeeld voor PHP kun je hier vinden: http://www.martinstoeckli.ch/php/php.html#bcrypt

Een stukje code PHP wat ik vaak gebruik en aan deze voorwaarden voldoet (sha256 met >15000 encryptie rondes):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class login {
    public static function securePass($input,$salt=null){
        //Secure password
        //Random salt if no salt given (if salt given its for decoding purposes)
        if($salt == null){
            $binaryLength = (int)(16 * 3 / 4 + 1);
            if(function_exists('openssl_random_pseudo_bytes')){
                $salt = substr(str_replace('+', '.',base64_encode(openssl_random_pseudo_bytes($binaryLength))), 0, 16);
            }elseif(function_exists('mcrypt_create_iv')){
                $salt = substr(str_replace('+', '.',base64_encode(mcrypt_create_iv ( $binaryLength , MCRYPT_DEV_URANDOM  ))), 0, 16);
            }else{
                $salt = substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 16);
            }
        }
        $crypttype = '$5$rounds=17838$';
        return substr(crypt($input,$crypttype.$salt.'$'),strlen($crypttype));
    }
    public static function validatePass($pass,$passhash){
        $passparts = explode('$',$passhash);
        $salt = $passparts[0];
        $out = self::securePass($pass,$salt);
        if(strcmp($out,$passhash) == 0){
            return true;
        }else{
            return false;
        }
    }
}


Gebruiksvoorbeeld:
PHP:
1
2
3
4
5
//Maak een hash aan die je in de database kunt opslaan
$hash = login::securePass($password);

//Controleer het wachtwoord met de hash uit de database
$valid = login::validatePass($password,$hash);


Een bijkomend voordeel is dat deze functie het gebruikte hashtype en rondes niet opslaat in de database, dus als een hacker een database dump heeft weet hij nog steeds niet hoeveel encryptie rondes je hebt gebruikt. Nadeel daarvan is dat als je de encryptie methode of het aantal rondes verandert, alle wachtwoorden uit je database het niet meer doen.

Tot slot: Wachtwoord hashing is niet alles, maar het is wel een belangrijke stap in ieder login systeem. Wil je meer weten over websites en security? Kijk eens op https://www.owasp.org/