Шифрование с использованием mcrypt, PHP и MySQL - PullRequest
0 голосов
/ 22 апреля 2011

Я пытаюсь использовать 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 и $ password в базу данных 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 (зашифрованный пароль) извлекаются из базы данных, а ключ создается заново с использованием имени пользователя.

Это работает, но только иногда. Я не могу понять, почему. Мое единственное предположение состоит в том, что база данных не может принимать некоторые символы, которые генерирует шифрование, например цитаты.

Любая помощь будет принята с благодарностью!

Ответы [ 4 ]

1 голос
/ 29 мая 2013

Вы можете попробовать код ниже для 2-х стороннего шифрования.Вы можете добавить соль с паролем согласно вашему требованию.

$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 ниже, и я использую его в своем приложении.

https://stackoverflow.com/a/9262137/1724762

1 голос
/ 22 апреля 2011
$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
}

Я не утверждаю, что это самый безопасный способ, это просто небольшой пример одностороннего хеширования с солью.

0 голосов
/ 02 февраля 2012

Согласились, что для вашего конкретного случая использования (хранения паролей пользователей) лучше использовать односторонний хэш.

Но для людей, которым действительно нужно использовать mcrypt, PHP и MySQL, посмотрите различные опции в MySql вставляет двоичные данные в БД без ошибок . Один простой вариант - base64_encode / base64_decode - , вот пример .

0 голосов
/ 22 апреля 2011

Если вы храните пароль пользователя в базе данных, вы должны использовать одностороннее хеширование

Вот только очень минималистичный пример

$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 в моем примере.Имейте в виду, это просто предложение для хранения пользовательских паролей в базе данных.

...