Beste Password Encryption

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Peter  Flos

Peter Flos

31/08/2014 11:07:55
Quote Anchor link
Welke encryption raden jullie aan voor het opslaan van wachtwoorden? En waarom?
 
PHP hulp

PHP hulp

25/12/2024 14:21:09
 
B a s
Beheerder

B a s

31/08/2014 11:31:01
Quote Anchor link
Zelf gebruik ik bcrypt. Je wachtwoord krijgt een salt & peper en de hash die je terug krijgt is iedere keer weer anders. Zie http://www.phphulp.nl/php/script/beveiliging/hash-bcrypt-class-encryption/1954/.
Gewijzigd op 31/08/2014 11:31:16 door B a s
 
Ward van der Put
Moderator

Ward van der Put

31/08/2014 12:20:32
 
Peter  Flos

Peter Flos

31/08/2014 12:27:53
Quote Anchor link
Normaal gesproken doe ik het met SHA1 of MD5, maar daar staan tegenwoordig zoveel decrypers van online dat je niet kunt zeggen dat die beveiliging "Goed" is.

@Bas: Waarom heeft bcrypt jouw voorkeur?
@Ward: Raad jij password_hash() aan? En waarom?
 
Ward van der Put
Moderator

Ward van der Put

31/08/2014 12:33:11
Quote Anchor link
Bij password_hash() krijg je een "fool proof" password_verify() voor de wachtwoordcontrole cadeau. Bovendien is het geheel "future proof" voor nieuwe encryptiealgoritmen dankzij password_needs_rehash(). Als je dus niet precies weet wat je zou moeten bouwen (en ook niet waarom eigenlijk), dan zou ik deze password_* functiefamilie aanbevelen.
 
B a s
Beheerder

B a s

31/08/2014 13:24:52
Quote Anchor link
Die functies zullen in dit geval doeltreffender zijn ja.

Ik geef voorkeur aan bcrypt omdat deze (naast je eigen salt) zelf een ingebouwde salt heeft. Het genereert random iedere keer dat je inlogt een random hash waardoor kwaadwilligen je wachtwoord minder snel kunnen verkrijgen.

Gebruik je dit niet, dan kunnen kwaadwilligen via een zogenoemde ranbow table je wachtwoord snel verkijgen. Gebruik je bijvoorbeeld alleen letters en cijfers en is je wachtwoord 6 karakters lang en MD5 'beveiligd' (+/- 335 MB), dan is deze binnen 40 seconden te kraken.

Er blijven uiteraard vele discussies over welke wel en welke niet gebruiken. Stel je zelf wel de vraag waarvoor je het gaat gebruiken. Heb je bijvoorbeeld een website waaraan vele persoonlijke informatie is gekoppeld (namen, adressen, geboortedata, bankgegevens), dan moet je je hierin verdiepen. Is het voor een simpel forum dan dien je het ook goed te beveiligen, maar vormt de data die je hebt een minder groot risico om gehackt te worden. Het is minder interessant.

Een snelle Google levert tevens een grote voorstander van Bcrypt op, maar ook een grote tegenstander.

Edit:
Linkjes toegevoegd
Gewijzigd op 31/08/2014 13:27:26 door B a s
 
Bart V B

Bart V B

31/08/2014 13:28:40
Quote Anchor link
Ik heb vanmorgen toevallig met password optie van php gespeeld.
Een password word Heel mooi random gemaakt, waardoor het altijd anders is.

Even een opzetje zodat je ziet wat er gebeurd:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$options
= [
                    'cost' => 12,
                   ];

        // Get the password from post
        $passwordFromPost = 'test';

        $hash = password_hash($passwordFromPost, PASSWORD_BCRYPT, $options);
        
        echo $hash;
        echo '<br />';
        
        // Get the password from the database and compare it to a variable (for example post)
        //$passwordFromPost = $_POST['password'];

        $hashedPasswordFromDB = '$2y$12$ZYN23Q1VG1T2a2nJjAjw7.wvusVCWxQSRq9q1rYEIJakVjtsjfVki';

        if (password_verify($passwordFromPost, $hashedPasswordFromDB))
                {

                   echo 'Password is valid!';
        }
else {
                   echo 'Invalid password.';
        }


?>
Gewijzigd op 31/08/2014 14:39:30 door Bart V B
 
Peter  Flos

Peter Flos

31/08/2014 14:28:45
Quote Anchor link
Ik zit met het probleem dat ik met PHP 5.3 zit. Bcrypt en password_hash zijn dus helaas geen oplossingen.
 
Ward van der Put
Moderator

Ward van der Put

31/08/2014 14:32:53
Quote Anchor link
Er is een password_compat voor PHP >= 5.3.7:

https://github.com/ircmaxell/password_compat
 
Bart V B

Bart V B

31/08/2014 14:39:48
Quote Anchor link
Ben nog even verder gegaan op dit stukje code met password_needs_rehash(), het is me alleen nog niet helemaal duidelijk hoe dit werkt.
Ik heb het geprobeerd met deze code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
29
30
31
32
33
34
35
36
37
38
39
40
<?php

$options
= [
             'cost' => rand(6,12)
           ];

        // Get the password from post
        $passwordFromPost = 'test';

        $hash = password_hash($passwordFromPost, PASSWORD_BCRYPT, $options);
        
        echo $hash;
        echo '<br />';
        
        // Get the password from the database and compare it to a variable (for example post)
        //$passwordFromPost = $_POST['password'];

        $hashedPasswordFromDB = '$2y$11$iMqEwGNqcsskpAAdPEJPbO/bsatfcBlc71TyUgy1i8i0wXoArrjXe';

        if (password_verify($passwordFromPost, $hashedPasswordFromDB))
        {


            echo 'Password is valid!';

            //  CHECK TO SEE PASSWORD NEED REHASH

            if (password_needs_rehash($hashedPasswordFromDB, PASSWORD_BCRYPT, $options))
            {


                $hashNew = password_hash($hashedPasswordFromDB, PASSWORD_BCRYPT, $options);
                echo '<br>';
                echo $hashNew;

            }

        }

        else
        {

            echo 'Invalid password.';
        }

?>

Als ik op mijn f5 knop blijf rammen dan update hij altijd de hash. Dus een vaste arrray met cost => 12. Als ik de array aanpas met een rand(6,12) dan update hij af en toe wel en af en toe niet. Is het gebruikelijk om daar een rand() in te bouwen?
 
Ward van der Put
Moderator

Ward van der Put

31/08/2014 14:51:42
Quote Anchor link
Hogere kosten zijn veiliger. Er is geen reden om een hash met hoge kosten te vervangen door een onveiligere hash met lagere kosten, dus waarom wil je dat aselect variëren?

Als je dan toch iets wilt variëren, neem dan de salt onder handen. Die moet minstens even lang zijn als de hash zelf én globaal uniek zijn (dus niet slechts aselect, maar ook nergens in de database voorkomen: niet als andere salt, maar ook niet als bijvoorbeeld afgeleide van een e-mailadres).
 
Peter  Flos

Peter Flos

31/08/2014 15:24:49
Quote Anchor link
Ward van der Put op 31/08/2014 14:32:53:
Er is een password_compat voor PHP >= 5.3.7:

https://github.com/ircmaxell/password_compat

Top, werkt perfect :)
 
Bart V B

Bart V B

31/08/2014 21:31:13
Quote Anchor link
Quote:
Hogere kosten zijn veiliger. Er is geen reden om een hash met hoge kosten te vervangen door een onveiligere hash met lagere kosten, dus waarom wil je dat aselect variëren

@Ward,

Dat snap ik, wat ik wil snappen is waarom, als ik een vaste hoge hash kosten gebruik waarom ik altijd password_needs_rehash() zijn werk zie doen, terwijl als ik die hoge kosten @random maak niet.
Dan zie ik namelijk gebeuren wat ik zou verwachten, en dat is soms wel een nieuwe password hash word gedaan en soms niet. Vandaar dat ik de functie nog niet helemaal snap.

Want dat zou betekenen dat hij hem dus altijd een update query zou doen naar de database.
Op zich niet zo'n groot probleem maar ik verwachte van die functie dat hij om de zoveel tijd dit eens zou uitvoeren.

EDIT.
Hmmm... vreemd, even een nieuwe hash in de string geplakt en nu doet hij wel wat ik verwacht. Laten we zeggen "het werkt" :S
Gewijzigd op 31/08/2014 21:46:16 door Bart V B
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.