Z2WsOLZCdTqx1442rsl+40PQ8mWmwjZI86V5FKPeuLcMuQGbXextualYyRWego3NhdKwXDm/LJ7PZrkdgiQX23langZ45h6juf65yPMb3o4uz4fqzxF9kH+N5NazhMPYzq9hUeh5d8MBrLOQS0EXyLGo1VQSlhYi1IrpEzLke1Y= <?
/*
Password-Based Key Derivation Function 2

PBKDF2, is een methode om een wachtwoord met salt meerdere keren in een "derived key" te berekenen.
Aanroepen van deze functie is zeer simpel:
pbkdf2($password, $salt, $algorithm = 'sha512', $count = 20000, $key_length = 128, $raw_output = false);
De variabelen spreken voor zich. Het aantal iterations staat standaard op 20000 in combinatie met een key length van 128. Een sterk wachtwoord en een goede hash, zal de wachtwoorden van je klanten een stuk veiliger maken.
Tijdens een bruteforce poging met een vooraf gegeven salt, was de maximale snelheid voor het maken van een wachtwoord 0.04-0.06 seconde. Het duurt een flink aantal uur om een wachtwoord van enkele karakters te kraken, laat staan wachtwoorden van 10+ karakters.
*/

function pbkdf2($password$salt$algorithm 'sha512'$count 20000$key_length 128$raw_output false)
{
    if(!
in_array($algorithmhash_algos(), true)) {
        exit(
'pbkdf2: Hash algoritme is niet geinstalleerd op het systeem.');
    }
    
    if(
$count <= || $key_length <= 0) {
        
$count 20000;
        
$key_length 128;
    }

    
$hash_length strlen(hash($algorithm""true));
    
$block_count ceil($key_length $hash_length);

    
$output "";
    for(
$i 1$i <= $block_count$i++) {
        
$last $salt pack("N"$i);
        
$last $xorsum hash_hmac($algorithm$last$passwordtrue);
        for (
$j 1$j $count$j++) {
            
$xorsum ^= ($last hash_hmac($algorithm$last$passwordtrue));
        }
        
$output .= $xorsum;
    }

    if(
$raw_output) {
        return 
substr($output0$key_length);
    }
    else {
        return 
base64_encode(substr($output0$key_length));
    }
}

// Voorbeeld
echo pbkdf2('admin''wachtwoord');

show_source(__FILE__);
?>