Я использую простой md5($password);
но я хочу добавить соль так, как я могу это сделать?
вот мой код:
if($success) { $data['firstname'] = $firstname; $data['lastname'] = $lastname; $data['username'] = $username; $data['password'] = md5($password); $data['email'] = $email; $newUser = new User($data); $newUser->save(true); $Newuser->login($username, $password); header("Location: welcome.php"); }
$data['hashedpwd'] = md5($salt . $password);
Чем дольше, более сложным и уникальным для каждого пользователя вы можете сделать соль, тем сложнее будет получить пароль (хотя это не невозможно).
Простой (но бедной солью) будет: $salt = '10';
Гораздо более сильная соль будет: $salt = '-45dfeHK/__yu349@-/klF21-1_\/4JkUP/4';
Соли, которые уникальны для пользователя, еще лучше.
Как упоминалось в нескольких комментариях, md5 представляет собой старый и относительно плохой алгоритм хэширования, SHA-512 или любое из SHA-2 семей будет гораздо лучшим выбором.
См. Этот вопрос соления для более подробной информации.
Другие люди показали, как это можно сделать, поэтому об общих принципах …
Как уже было связано с NullUserException в комментариях, вы не должны делать этого, просто добавляя статическую соль к md5, если проблема безопасности. Обратите внимание, однако, что вы можете хранить свою соль как есть . Как статическая соль, так и md5 не считаются очень безопасными подходами. Они в порядке, если это не так важно, но если это так, вы должны пойти другим путем.
О статической соли:
Общей ошибкой является использование той же соли в каждом хеше. Либо соль жестко закодирована в программу, либо генерируется случайным образом один раз. Это неэффективно, потому что, если у двух пользователей одинаковый пароль, они все равно будут иметь одинаковый хеш. Злоумышленник по-прежнему может использовать атаку с обратным поиском, чтобы одновременно запускать атаку словаря на каждый хэш. Они просто должны применять соль для каждого пароля до того, как они сделают это. Если соль жестко закодирована в популярный продукт, для этой соли могут быть созданы справочные таблицы и радужные таблицы, чтобы упростить процесс хэширования, создаваемых продуктом.
Новая случайная соль должна генерироваться каждый раз, когда пользователь создает учетную запись или изменяет свой пароль.
Если соль статична, злоумышленник может просто создать радужный стол для всех возможностей. С солью, которая уникальна для пользователя, нет никакого смысла в этом.
md5 предназначен для вычислительной скорости, поэтому принципиально не путь . Кроме того, для этого уже есть много предварительно созданных радужных столов , а также множество онлайн-трещин .
Связанная страница содержит исходный код PHP , также как пример того, как это сделать правильно.
<?php /* * Password hashing with PBKDF2. * Author: havoc AT defuse.ca * www: https://defuse.ca/php-pbkdf2.htm */ // These constants may be changed without breaking existing hashes. define("PBKDF2_HASH_ALGORITHM", "sha256"); define("PBKDF2_ITERATIONS", 1000); define("PBKDF2_SALT_BYTES", 24); define("PBKDF2_HASH_BYTES", 24); define("HASH_SECTIONS", 4); define("HASH_ALGORITHM_INDEX", 0); define("HASH_ITERATION_INDEX", 1); define("HASH_SALT_INDEX", 2); define("HASH_PBKDF2_INDEX", 3); function create_hash($password) { // format: algorithm:iterations:salt:hash $salt = base64_encode(mcrypt_create_iv(PBKDF2_SALT_BYTES, MCRYPT_DEV_URANDOM)); return PBKDF2_HASH_ALGORITHM . ":" . PBKDF2_ITERATIONS . ":" . $salt . ":" . base64_encode(pbkdf2( PBKDF2_HASH_ALGORITHM, $password, $salt, PBKDF2_ITERATIONS, PBKDF2_HASH_BYTES, true )); } function validate_password($password, $good_hash) { $params = explode(":", $good_hash); if(count($params) < HASH_SECTIONS) return false; $pbkdf2 = base64_decode($params[HASH_PBKDF2_INDEX]); return slow_equals( $pbkdf2, pbkdf2( $params[HASH_ALGORITHM_INDEX], $password, $params[HASH_SALT_INDEX], (int)$params[HASH_ITERATION_INDEX], strlen($pbkdf2), true ) ); } // Compares two strings $a and $b in length-constant time. function slow_equals($a, $b) { $diff = strlen($a) ^ strlen($b); for($i = 0; $i < strlen($a) && $i < strlen($b); $i++) { $diff |= ord($a[$i]) ^ ord($b[$i]); } return $diff === 0; } /* * PBKDF2 key derivation function as defined by RSA's PKCS #5: https://www.ietf.org/rfc/rfc2898.txt * $algorithm - The hash algorithm to use. Recommended: SHA256 * $password - The password. * $salt - A salt that is unique to the password. * $count - Iteration count. Higher is better, but slower. Recommended: At least 1000. * $key_length - The length of the derived key in bytes. * $raw_output - If true, the key is returned in raw binary format. Hex encoded otherwise. * Returns: A $key_length-byte key derived from the password and salt. * * Test vectors can be found here: https://www.ietf.org/rfc/rfc6070.txt * * This implementation of PBKDF2 was originally created by https://defuse.ca * With improvements by http://www.variations-of-shadow.com */ function pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false) { $algorithm = strtolower($algorithm); if(!in_array($algorithm, hash_algos(), true)) die('PBKDF2 ERROR: Invalid hash algorithm.'); if($count <= 0 || $key_length <= 0) die('PBKDF2 ERROR: Invalid parameters.'); $hash_length = strlen(hash($algorithm, "", true)); $block_count = ceil($key_length / $hash_length); $output = ""; for($i = 1; $i <= $block_count; $i++) { // $i encoded as 4 bytes, big endian. $last = $salt . pack("N", $i); // first iteration $last = $xorsum = hash_hmac($algorithm, $last, $password, true); // perform the other $count - 1 iterations for ($j = 1; $j < $count; $j++) { $xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true)); } $output .= $xorsum; } if($raw_output) return substr($output, 0, $key_length); else return bin2hex(substr($output, 0, $key_length)); }
PHP 5.5 принесет очень простой в использовании API хеширования паролей, и в настоящее время он переопределяется для использования сразу с PHP начиная с версии 5.3.7.
Я мог бы скопировать и вставить объяснение, но сам убедиться: https://github.com/ircmaxell/password_compat
Короче говоря, это так:
/* Create the hash */ $hash = password_hash($password, PASSWORD_BCRYPT, array('cost' => 10)); /* Store the hash... then user comes back */ if (password_verify($password, $hash)) { /* Valid */ } else { /* Invalid */ } /* * If the security level has to be increased to new $options or a new $algorithm, * silent rehashing is supported */ if (password_verify($password, $hash)) { if (password_needs_rehash($hash, $algorithm, $options)) { $hash = password_hash($password, $algorithm, $options); /* Store new hash in db */ } }
Хэш может составлять до 255 символов (не с помощью bcrypt, но все, что может появиться дальше), соответственно планируйте хранилище. Базы данных должны использовать VARCHAR (255).
$salt="Your text vatiable"; $data[passsord] = md5($salt . $password);
Вот пример: (Используйте свой пароль здесь)
$pass = 'abcxyz123'; // password $salt = '}#f4ga~g%7hjg4&j(7mk?/!bj30ab-wi=6^7-$^R9F|GK5J#E6WT;IO[JN'; // random string $hash = md5($pass); $hash_md5 = md5($salt . $pass); // echo now echo 'Original Password: ' . $pass . '<br><br>'; echo 'Original Salt: ' . $salt . '<br><br>'; echo 'MD5: ' . $hash . '<br><br>'; echo 'MD5 with Salt: ' . $hash_md5 . '<br><br>';