diff options
author | Anthony Ferrara <ircmaxell@gmail.com> | 2015-08-11 10:39:38 -0400 |
---|---|---|
committer | Anthony Ferrara <ircmaxell@gmail.com> | 2015-08-11 10:39:38 -0400 |
commit | 1ecb013b51756effed3a3c446a314084b54c9916 (patch) | |
tree | 1498ed2c918da1309e30e470c7ca3c7652bf0e62 | |
parent | 402677b21b0e11fa4e6839dc92396a05bd702825 (diff) | |
download | password_compat-1ecb013b51756effed3a3c446a314084b54c9916.zip password_compat-1ecb013b51756effed3a3c446a314084b54c9916.tar.gz password_compat-1ecb013b51756effed3a3c446a314084b54c9916.tar.bz2 |
Improve random generation to only trust openssl if strong is true (which is still bad due to openssl, but better)
-rw-r--r-- | lib/password.php | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/lib/password.php b/lib/password.php index 96f22eb..f07fafb 100644 --- a/lib/password.php +++ b/lib/password.php @@ -108,22 +108,25 @@ namespace { } } if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) { - $buffer = openssl_random_pseudo_bytes($raw_salt_len); - if ($buffer) { + $strong = false; + $buffer = openssl_random_pseudo_bytes($raw_salt_len, $strong); + if ($buffer && $strong) { $buffer_valid = true; } } if (!$buffer_valid && @is_readable('/dev/urandom')) { $file = fopen('/dev/urandom', 'r'); - $read = PasswordCompat\binary\_strlen($buffer); + $read = 0; + $local_buffer = ''; while ($read < $raw_salt_len) { - $buffer .= fread($file, $raw_salt_len - $read); - $read = PasswordCompat\binary\_strlen($buffer); + $local_buffer .= fread($file, $raw_salt_len - $read); + $read = PasswordCompat\binary\_strlen($local_buffer); } fclose($file); if ($read >= $raw_salt_len) { $buffer_valid = true; } + $buffer = str_pad($buffer, $raw_salt_len, "\0") ^ str_pad($local_buffer, $raw_salt_len, "\0"); } if (!$buffer_valid || PasswordCompat\binary\_strlen($buffer) < $raw_salt_len) { $buffer_length = PasswordCompat\binary\_strlen($buffer); |