Шифрование полей в MySQL

В MySQL есть несколько встроенных функций шифрования, подробное описание на dev.mysql.com. Рассмотрим основные на примерах c использованием PHP PDO.

Пароли и ключи переданные в запросах SQL отправляются сервер MySQL в открытом виде, если не используется SSL-соединение. Кроме того, такие значения будут отображаться в логах. Чтобы этого избежать рекомендуется шифровать значения на стороне клиента или использовать хранимые процедуры.

1

Хранение данных в БД

Функции шифрования возвращают зашифрованный текст в виде двоичных данных, поэтому хранить их нужно в полях с типом BLOB:

Поле с типом BLOB

2

Алгоритм DES

DES_ENCRYPT(str, key) – шифрует строку с использованием алгоритма Triple-DES.

$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$sth = $dbh->prepare("
	INSERT INTO 
		`table` 
	SET 
		`id` = NULL,
		`text` = DES_ENCRYPT(:text, :key)
");

$sth->execute(array('text' => 'Текст который нужно зашифровать', 'key' => 'пароль'));
PHP

DES_DECRYPT(crypt_str, key) – расшифровывает строку, если возникает ошибка, эта функция возвращается NULL.

$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$sth = $dbh->prepare("
	SELECT 
		*,
		DES_DECRYPT(`text`, :key) AS `text`
	FROM
		`table` 
	WHERE
		`id` = 1
");

$sth->execute(array('key' => 'пароль'));
$array = $sth->fetch(PDO::FETCH_ASSOC);
print_r($array['text']);
PHP
3

Алгоритм AES

AES, также известный как Rijndael – симметричный алгоритм блочного шифрования, рекомендуется использовать в место DES.

AES_ENCRYPT(str, key) – шифрует строку str ключом key.

$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$sth = $dbh->prepare("
	INSERT INTO 
		`table` 
	SET 
		`id` = NULL,
		`text` = AES_ENCRYPT(:text, :key)
");

$sth->execute(array('text' => 'Текст который нужно зашифровать', 'key' => 'пароль'));
PHP

AES_DECRYPT(crypt_str, key) – расшифровывает строку.

$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$sth = $dbh->prepare("
	SELECT 
		*,
		AES_DECRYPT(`text`, :key) AS `text`
	FROM
		`table` 
	WHERE
		`id` = 1
");

$sth->execute(array('key' => 'пароль'));
$array = $sth->fetch(PDO::FETCH_ASSOC);
print_r($array['text']);
PHP
23.10.2018, обновлено 30.08.2019 1505
Следующая запись Временные таблицы в MySQL

Поделится

Темы

БД

Другие публикации

В продолжении статьи о верстки рейтинга, рассмотрим PHP-скрипты системы отзывов и рейтинга в интернет-магазине.
В статье рассмотрены примеры как вывести метку на карту из БД и вывод других объектов, которые находятся рядом.
Пример создания файла карты сайта (sitemap.xml) на PHP. Интеграция его на сайт и подключение его в robots.txt
Два примера чтения xml файлов, которые обновляют цены и остатки в базе данных интернет магазина.
PHP функции для исправление неправильной раскладки клавиатуры в тексте и использование их в поиске по сайту.
В данном примере описано как вывести многоуровневый список checkbox и radio button из БД с помощью PHP функций...