Salt maken met OpenSSL of Mcrypt

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ward van der Put
Moderator

Ward van der Put

01/11/2014 12:30:57
Quote Anchor link
Kan ik voor het genereren van een salt beter openssl_random_pseudo_bytes() of mcrypt_create_iv() gebruiken?
 
PHP hulp

PHP hulp

14/05/2021 03:55:02
 
Willem vp

Willem vp

01/11/2014 13:35:28
Quote Anchor link
Volgens mij is het lood om oud ijzer. Het belangrijkste aan een salt is dat hij (wereldwijd) uniek is, maar voor een goed hashing-algoritme zou het niet moeten uitmaken wat er verder in de salt staat. Hoe langer de salt, hoe groter de kans dat hij uniek is.

Wat ik ook wel eens zie, is dat er een uuid wordt gebruikt. Ook die voldoen aan de voorwaarde dat ze wereldwijd uniek zijn (althans, de kans is best wel klein dat je twee dezelfde genereert) en ze zijn bovendien snel te genereren.
 
Ward van der Put
Moderator

Ward van der Put

01/11/2014 14:03:41
Quote Anchor link
Dank je Willem, een UUID is inderdaad ook een goede optie.

Het gaat overigens om een verbetering van deze $salt uit OpenCart:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$salt = substr(md5(uniqid(rand(), true)), 0, 9);


Dat is natuurlijk een opeenstapeling van meerdere fouten.
 
Eddy E

Eddy E

01/11/2014 22:00:57
Quote Anchor link
Substr(... 9) is wel een hele korte salt inderdaad.
En md5() met een undefined rand() ook.

Dat kan inderdaad veel beter. En of je nu 255 tekens of 9 opslaat, dat verschil is echt te verwaarlozen.
 
Ward van der Put
Moderator

Ward van der Put

01/11/2014 22:15:01
Quote Anchor link
THX Eddy, helemaal goed!

Knelpunten:

1. rand() is zwakker dan mt_rand();
2. uniqid() geeft geen unieke ID;
3. md5() is zwak en verouderd;
4. substr() geeft hier maar 9 hexadecimale karakters.

Ik heb mijn voorlopige oplossing in een inhaaktopic gepost.
 
Stefan Fransen

Stefan Fransen

04/11/2014 08:49:48
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
   $salt
= base64_encode(mcrypt_create_iv(24, MCRYPT_DEV_URANDOM));
?>
Gewijzigd op 04/11/2014 08:53:27 door Stefan Fransen
 
Eddy E

Eddy E

04/11/2014 09:50:15
Quote Anchor link
Waarom die base64_encode()?
Daarmee vertaal je eventueel moeilijk te raden tekens naar makkelijkere (A-Z, a-z, 0-9).
Je kan het wel makkelijker doorspelen via urls etc, maar waarom zou je dit doen?
Goed, je kan het terugvertalen (en is dus geen hash), maar toch.
 
Willem vp

Willem vp

04/11/2014 09:56:42
Quote Anchor link
> Daarmee vertaal je eventueel moeilijk te raden tekens naar makkelijkere (A-Z, a-z, 0-9).

Een salt mag openbaar zijn, dus is het al dan niet moeilijk kunnen raden geen issue.

Hoogstens zou je kunnen zeggen dat een base64-encode de entropie van de salt verlaagt, maar ook dat is eigenlijk niet zo'n heel belangrijk punt. Als de salt maar uniek is. ;-)
 
Ward van der Put
Moderator

Ward van der Put

04/11/2014 10:36:00
Quote Anchor link
Dank allen!

> Een salt mag openbaar zijn, dus is het al dan niet moeilijk kunnen raden geen issue.

Correct. Ik heb de methode daarom vereenvoudigd tot ASCII-karakters en de Mersenne Twister. Daarbij staat $this->Length standaard op 255, zodat de salt makkelijk in een CHAR(255) is op te slaan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
public function randomize()
{

    $chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    $salt = (string)null;
    $size = strlen($chars);
    for ($i = 0; $i < $this->Length; $i++) {
        $salt .= $chars[mt_rand(0, $size - 1)];
    }

    $this->Salt = $salt;
    return $this;
}

?>
 



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.