bcrypt i losowo generowane sole
Więc eksperymentowałem z bcryptem. Mam klasę (pokazaną poniżej, którą dostałem odhttp://www.firedartstudios.com/articles/read/php-security-how-to-safely-store-your-passwords) w którym są 3 funkcje. Pierwszy z nich to wygenerowanie losowej Soli, drugi do wygenerowania skrótu za pomocą pierwszej wygenerowanej Soli, a ostatni to zweryfikowanie dostarczonego hasła poprzez porównanie go z hashem.
<?php
/* Bcrypt Example */
class bcrypt {
private $rounds;
public function __construct($rounds = 12) {
if(CRYPT_BLOWFISH != 1) {
throw new Exception("Bcrypt is not supported on this server, please see the following to learn more: http://php.net/crypt");
}
$this->rounds = $rounds;
}
/* Gen Salt */
public function genSalt() {
/* openssl_random_pseudo_bytes(16) Fallback */
$seed = '';
for($i = 0; $i < 16; $i++) {
$seed .= chr(mt_rand(0, 255));
}
/* GenSalt */
$salt = substr(strtr(base64_encode($seed), '+', '.'), 0, 22);
/* Return */
return $salt;
}
/* Gen Hash */
public function genHash($password) {
/* Explain '$2yJeśli na przykład wygeneruję hash z hasłem, otrzymam hashowane hasło, które odebrało randmonly wygenerowaną sól. Następnie, jeśli ponownie wprowadzę hasło i skorzystam z funkcji weryfikacji, otrzymam prawdę, że hasła są zgodne. Jeśli wprowadzę nieprawidłowe hasło, otrzymam fałszywe. Moje pytanie brzmi: jak to możliwe? A co z losowo generowaną solą? Dlaczego to nie ma żadnego skutku?
. $this->rounds . 'Jeśli na przykład wygeneruję hash z hasłem, otrzymam hashowane hasło, które odebrało randmonly wygenerowaną sól. Następnie, jeśli ponownie wprowadzę hasło i skorzystam z funkcji weryfikacji, otrzymam prawdę, że hasła są zgodne. Jeśli wprowadzę nieprawidłowe hasło, otrzymam fałszywe. Moje pytanie brzmi: jak to możliwe? A co z losowo generowaną solą? Dlaczego to nie ma żadnego skutku?
*/
/* 2a selects bcrypt algorithm */
/* $this->rounds is the workload factor */
/* GenHash */
$hash = crypt($password, '$2yJeśli na przykład wygeneruję hash z hasłem, otrzymam hashowane hasło, które odebrało randmonly wygenerowaną sól. Następnie, jeśli ponownie wprowadzę hasło i skorzystam z funkcji weryfikacji, otrzymam prawdę, że hasła są zgodne. Jeśli wprowadzę nieprawidłowe hasło, otrzymam fałszywe. Moje pytanie brzmi: jak to możliwe? A co z losowo generowaną solą? Dlaczego to nie ma żadnego skutku?
. $this->rounds . 'Jeśli na przykład wygeneruję hash z hasłem, otrzymam hashowane hasło, które odebrało randmonly wygenerowaną sól. Następnie, jeśli ponownie wprowadzę hasło i skorzystam z funkcji weryfikacji, otrzymam prawdę, że hasła są zgodne. Jeśli wprowadzę nieprawidłowe hasło, otrzymam fałszywe. Moje pytanie brzmi: jak to możliwe? A co z losowo generowaną solą? Dlaczego to nie ma żadnego skutku?
. $this->genSalt());
/* Return */
return $hash;
}
/* Verify Password */
public function verify($password, $existingHash) {
/* Hash new password with old hash */
$hash = crypt($password, $existingHash);
/* Do Hashs match? */
if($hash === $existingHash) {
return true;
} else {
return false;
}
}
}
/* Next the Usage */
/* Start Instance */
$bcrypt = new bcrypt(12);
/* Two create a Hash you do */
echo 'Bcrypt Password: ' . $bcrypt->genHash('password');
/* Two verify a hash you do */
$HashFromDB = $bcrypt->genHash('password'); /* This is an example you would draw the hash from your db */
echo 'Verify Password: ' . $bcrypt->verify('password', $HashFromDB);
?>
Jeśli na przykład wygeneruję hash z hasłem, otrzymam hashowane hasło, które odebrało randmonly wygenerowaną sól. Następnie, jeśli ponownie wprowadzę hasło i skorzystam z funkcji weryfikacji, otrzymam prawdę, że hasła są zgodne. Jeśli wprowadzę nieprawidłowe hasło, otrzymam fałszywe. Moje pytanie brzmi: jak to możliwe? A co z losowo generowaną solą? Dlaczego to nie ma żadnego skutku?