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

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

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

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

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

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

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

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

  • Расшифровка: загрузка зашифрованного кода base64 из MySQL> Base64 Decode> MCrypt Decrypt -> Orignal Text

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

<?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 

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

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

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

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

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

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

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