PHP использует mcrypt и хранит зашифрованные в MySQL

Я использую Mcrypt для шифрования некоторых строк.

После этого я сохраняю их в своей базе данных, но в моей базе данных это выглядит как «?? f ?? R ????? h $», потому что многие специальные символы заменяются на «?».

Нужно ли использовать специальную кодировку или есть другой простой способ?

С Уважением,
Cr41s3

2

Решение

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

Вы можете сделать что-то вроде этого, чтобы решить вашу проблему:

  • Шифрование: Оригинальный текст> MCrypt Encrypt> Base64 Encode> Сохранить как обычный текст в MySQL

  • Расшифровка: загрузка зашифрованного текста в кодировке base64 из MySQL> Декодирование Base64> Расшифровка MCrypt -> Оригинальный текст

Вот как бы я это сделал. Создайте класс для шифрования / дешифрования:

<?php

class cipher
{
private $securekey;
private $iv_size;

function __construct($textkey)
{
$this->iv_size = mcrypt_get_iv_size(
MCRYPT_RIJNDAEL_128,
MCRYPT_MODE_CBC
);
$this->securekey = hash(
'sha256',
$textkey,
TRUE
);
}

function encrypt($input)
{
$iv = mcrypt_create_iv($this->iv_size);
return base64_encode(
$iv . mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
$this->securekey,
$input,
MCRYPT_MODE_CBC,
$iv
)
);
}

function decrypt($input)
{
$input = base64_decode($input);
$iv = substr(
$input,
0,
$this->iv_size
);
$cipher = substr(
$input,
$this->iv_size
);
return trim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
$this->securekey,
$cipher,
MCRYPT_MODE_CBC,
$iv
)
);
}
}

?>

Затем используйте это так:

// Usage
$cipher = new cipher('my-secret-key');
$orignal_text = 'my secret message';
$encrypted_text = $cipher->encrypt($orignal_text);   // store this in db
$decrypted_text = $cipher->decrypt($encrypted_text); // load $encrypted_text from db

// Debug
echo "<pre>";
echo "Orignal Text  : $orignal_text\r\n";
echo "Encrypted Text: $encrypted_text\r\n";
echo "Decrypted Text: $decrypted_text";
echo "</pre>";

Это соответственно выводит следующее:

Orignal Text  : my secret message
Encrypted Text: Z21ifr5dHEdE9nO8vaDWb9QkjooqCK4UI6D/Ui+fkpmXWwmxloy8hM+7oimtw1wE
Decrypted Text: my secret message
7

Другие решения

1) Чтобы хранить двоичные файлы в MySQL, используйте тип BINARY / VARBINARY / BLOB вместо CHAR / VARCHAR / TEXT

2) При сохранении двоичных данных в БД используйте метод, который не будет применять какую-либо обработку к «тексту» (вы не хотите, чтобы ваши двоичные данные обрабатывались, как если бы это была какая-то строка). Лучше всего использовать подготовленные заявления MySQL или PDO.

3) Если вы по какой-то причине хотите «видеть двоичные файлы в БД», вам нужно сделать их несколько читабельными. Как использование SELECT hex(binary_field) или же SELECT TO_BASE64(binary_field)

4) Если вы отказываетесь использовать BLOB и подготовленные операторы, ну, для хранения двоичных данных в mysql, сначала преобразуйте их, используя base64_encode (), чтобы он содержал только печатные символы.

2

Я сейчас использовал Метод Райана Винсента:

Я ‘base64_encode’ зашифрованные строки, прежде чем хранить их в базе данных. Это очень «безопасный» способ кодирования «двоичных строк». Они могут передаваться между системами через HTML, электронную почту и т. Д. И никогда не будут изменены.

Я сначала все кодирую с base64_encode а затем сохранить его в моей базе данных.

1
По вопросам рекламы [email protected]