В MySQL есть несколько встроенных функций шифрования, подробное описание на dev.mysql.com. Рассмотрим основные на примерах c использованием PHP PDO.
Пароли и ключи переданные в запросах SQL отправляются сервер MySQL в открытом виде, если не используется SSL-соединение. Кроме того, такие значения будут отображаться в логах. Чтобы этого избежать рекомендуется шифровать значения на стороне клиента или использовать хранимые процедуры.
Функции шифрования возвращают зашифрованный текст в виде двоичных данных, поэтому хранить их нужно в полях с типом BLOB:
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']);
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)
– расшифровывает строку.