summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnthony Ferrara <ircmaxell@gmail.com>2015-08-11 10:39:38 -0400
committerAnthony Ferrara <ircmaxell@gmail.com>2015-08-11 10:39:38 -0400
commit1ecb013b51756effed3a3c446a314084b54c9916 (patch)
tree1498ed2c918da1309e30e470c7ca3c7652bf0e62
parent402677b21b0e11fa4e6839dc92396a05bd702825 (diff)
downloadpassword_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.php13
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);