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

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

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

1

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

2

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, также известный как 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, обновлено 07.10.2020
19285
Предыдущая запись Поиск дубликатов MySQL
Следующая запись Временные таблицы в MySQL

Комментарии

, чтобы добавить комментарий.

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

Получить фото из Instagram без API
Так как Instagram и Fasebook ограничили доступ к API, а фото с открытого аккаунта всё же нужно периодически получать и...
24720
+7
Поиск похожих текстов в базе данных MySQL + PHP
Один из вариантов поиска похожих статей в базе данных основан на схождении слов в двух текстах.
7290
+6
PHP-класс обертка для PDO
Класс значительно упрощает работу с PDO, сокращает код. Реализован на статических классах и не требует создание экземпляра класса.
23039
+11
Поиск телефона в базе данных MySQL
Такой вопрос часто возникает т.к. в базе данных телефон может хранится в ненормализованном виде да и сама строка поиска...
8720
+1
Постраничный вывод и базы данных
В SQL запросах, для ограничения количества строк в результате используется инструкция LIMIT, например следующий вернёт...
17173
0
Обработка и вывод рейтинга в PHP
В продолжении статьи о верстки рейтинга, рассмотрим PHP-скрипты системы отзывов и рейтинга в интернет-магазине.
20171
+9