<?php
// source
// http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing-passwords-in-php

class Bcrypt {
  private 
$rounds;
  public function 
__construct($rounds 12) {
    if(
CRYPT_BLOWFISH != 1) {
      throw new 
Exception("bcrypt not supported in this installation. See http://php.net/crypt");
    }

    
$this->rounds $rounds;
  }

  public function 
hash($input) {
    
$hash crypt($input$this->getSalt());

    if(
strlen($hash) > 13)
      return 
$hash;

    return 
false;
  }

  public function 
verify($input$existingHash) {
    
$hash crypt($input$existingHash);

    return 
$hash === $existingHash;
  }

  private function 
getSalt() {
    
$salt sprintf('$2a$%02d$'$this->rounds);

    
$bytes $this->getRandomBytes(16);

    
$salt .= $this->encodeBytes($bytes);

    return 
$salt;
  }

  private 
$randomState;
  private function 
getRandomBytes($count) {
    
$bytes '';

    if(
function_exists('openssl_random_pseudo_bytes') &&
        (
strtoupper(substr(PHP_OS03)) !== 'WIN')) { // OpenSSL slow on Win
      
$bytes openssl_random_pseudo_bytes($count);
    }

    if(
$bytes === '' && is_readable('/dev/urandom') &&
       (
$hRand = @fopen('/dev/urandom''rb')) !== FALSE) {
      
$bytes fread($hRand$count);
      
fclose($hRand);
    }

    if(
strlen($bytes) < $count) {
      
$bytes '';

      if(
$this->randomState === null) {
        
$this->randomState microtime();
        if(
function_exists('getmypid')) {
          
$this->randomState .= getmypid();
        }
      }

      for(
$i 0$i $count$i += 16) {
        
$this->randomState md5(microtime() . $this->randomState);

        if (
PHP_VERSION >= '5') {
          
$bytes .= md5($this->randomStatetrue);
        } else {
          
$bytes .= pack('H*'md5($this->randomState));
        }
      }

      
$bytes substr($bytes0$count);
    }

    return 
$bytes;
  }

  private function 
encodeBytes($input) {
    
// The following is code from the PHP Password Hashing Framework
    
$itoa64 './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

    
$output '';
    
$i 0;
    do {
      
$c1 ord($input[$i++]);
      
$output .= $itoa64[$c1 >> 2];
      
$c1 = ($c1 0x03) << 4;
      if (
$i >= 16) {
        
$output .= $itoa64[$c1];
        break;
      }

      
$c2 ord($input[$i++]);
      
$c1 |= $c2 >> 4;
      
$output .= $itoa64[$c1];
      
$c1 = ($c2 0x0f) << 2;

      
$c2 ord($input[$i++]);
      
$c1 |= $c2 >> 6;
      
$output .= $itoa64[$c1];
      
$output .= $itoa64[$c2 0x3f];
    } while (
1);

    return 
$output;
  }
}

show_source(__FILE__);
?>
De HASH code met bcrypt: $2a$15$gGp5Yx3cyIpQGvFrFex3.OAx8mM9HiwBlULLu.HgYhDrURgV.QnLe <?php
/*
Hash bcrypt is een hash waarbij een salt wordt gebruikt. Dit is om bruteforce aanvallen (zoals het aflopen van een rainbow tabel) te voorkomen. Op dit moment is dit één van de veiligste methodes om wachtwoorden op te slaan.
Deze methode is eenrichtingsverkeer. Het is vrij onmogelijk om het daadwerkelijke wachtwoord te achterhalen. Je moet hiervoor zowel de salt (sleutel), rondes en wachtwoord weten; wat het dus eigenlijk gewoon onmogelijk maakt.

*/
$password "jewachtwoord";

include_once 
"bcrypt_class.inc.php";

$bcrypt = new Bcrypt(15); // rounds
$hash $bcrypt->hash($password);
$verification $bcrypt->verify($password$hash);

echo 
"De HASH code met bcrypt: $hash";
show_source(__FILE__);
?>
<br/>
<a href="bcrypt_class.inc.php">bcrypt_class.inc.php</a>

bcrypt_class.inc.php