MySQL

Шифрование полей в 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' => 'пароль'));

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']);
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' => 'пароль'));

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']);
23 октября 2018
Например, на сайте статей есть поиск, он ищет ключевое слово по полям: название статьи, title и основной текст. SQL...