Я пытаюсь использовать mcrypt для хранения пароля в моей базе данных. Прежде всего, это РАБОТАЕТ, но только в некоторые моменты времени.
Вот мой код шифрования:
//Encryption/Decryption key $key = $username.$username.$username.$username.$username; //Encryption Algorithm $cipher_alg = MCRYPT_RIJNDAEL_256; $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher_alg, MCRYPT_MODE_ECB), MCRYPT_RAND); $password = mcrypt_encrypt($cipher_alg, $key, $pass1, MCRYPT_MODE_CBC, $iv);
Затем он загружает $ username, $ iv и пароль $ в базу данных MySQL.
Вот мой код дешифрования:
//Encryption/Decryption key $key = $username.$username.$username.$username.$username; //Encryption Algorithm $cipher_alg = MCRYPT_RIJNDAEL_256; $dbpass = mcrypt_decrypt($cipher_alg, $key, $encpass, MCRYPT_MODE_CBC, $random); $dbpass = trim($dbpass); // Trim the fat
$ Username, $ iv и $ encpass (зашифрованный пароль) извлекаются из базы данных, а ключ воссоздается с использованием имени пользователя.
Это РАБОТАЕТ, но только иногда. Я не могу понять, почему. Мое единственное предположение заключается в том, что база данных не может принимать некоторые символы, которые генерирует шифрование, например, цитаты.
Любая помощь будет принята с благодарностью!
$salt = time(); // I would use something other than time(), something more random // store it in the db and redirect user connect(); $query = mysql_query("INSERT INTO user VALUES ('".mysql_real_escape_string($username)."', '".mysql_real_escape_string(sha1($password . $salt))."', '".mysql_real_escape_string($salt)."') "); // returning user $username = $_POST['username']; $password = $_POST['password']; // retrieve stored password connect(); $result = mysql_query("SELECT * FROM user WHERE username = '".mysql_real_escape_string($username)."' "); $row = mysql_fetch_assoc($result); if (!$result) { // user doesn't exist } $storedPassword = $row['password']; $salt = $row['salt']; $hashedPassword = sha1($password . $salt); if ($storedPassword != $hashedPassword) { // exit } else { // redirect user }
Я не утверждаю, что это самый безопасный, это просто небольшой пример одностороннего хэширования с солью.
Вы можете попробовать под кодом для двухстороннего шифрования. Вы можете добавить соль с паролем в соответствии с вашим требованием.
$key = 'ecryptionkey'; $string = 'password'; $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key)))); $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encrypted), MCRYPT_MODE_CBC, md5(md5($key))), "\0"); var_dump($encrypted); var_dump($decrypted);
Я получил этот код ниже URL-адреса, и я использую его в своем приложении.
Если вы храните пароль пользователя в базе данных, вы должны использовать одностороннее хеширование
Вот только очень минималистский пример
$username = $_POST['username']; $password = $_POST['password']; $salt = 'Some Salt'; $result = mysql_query("SELECT username, password WHERE username = '".mysql_real_escape_string($username)."' AND password = '".mysql_real_escape_string(sha1($password . $salt))."' LIMIT 1"); if(mysql_num_rows($result)) { // we have a match } else { // no match }
Вам нужно будет вставлять пароли пользователей с добавленной солью, используя sha1 в моем примере. Имейте в виду, это всего лишь предложение для хранения паролей пользователей в базе данных.
Согласился, что для вашего конкретного случая использования (хранения паролей пользователей) лучше всего использовать односторонний хеш.
Но для людей, которым действительно нужно использовать mcrypt, PHP и MySQL, см. Различные опции в MySql, вставляющие двоичные данные в db без ошибок . Один простой вариант – base64_encode
/ base64_decode
– вот пример .