T-SQL
Помимо симметричного шифрования, когда упаковка и распаковка текста
производятся одним и тем же ключом (общим для двух участников обмена
сообщениями), поддерживается и ассиметричное криптование. Идея ассиметричных
алгоритмов подразумевает наличие двух ключей – открытого и закрытого
(секретного). Один из них используется для шифрования информации, а другой — для
дешифрования. Если кодирование осуществляется с помощью открытого ключа, то
расшифровать такие данные можно только с помощью парного ему закрытого.
Предлагаю разобраться с этим на примере Microsoft SQL Server, который часто
используется в корпоративных порталах и сложных приложениях.
Для шифрования применяются функции T-SQL, представляющие собой специальное
дополнение языка SQL. Оно поддерживает управляющие операторы, локальные
переменные и различные дополнительные функции.
Одна из таких функций — EncryptByCert(), используемая для ассиметричного
шифрования данных с помощью сертификатов. Открытым ключом тут выступает
сертификат. Только откуда этот сертификат взять? Ответ прост – сгенерировать с
помощью другой специальной функции. Покажу на примере, как можно сгенерировать
сертификат с именем для andrej базы «Bank» с помощью хранимой процедуры:
USE Bank;
CREATE CERTIFICATE andrej
ENCRYPTION BY PASSWORD = «pGFD4bb925DGvbd2439587y»
# Для генерации с использованием подгрузки из файла
# FROM FILE = «c:\Shipping\Certs\Shipping11.cer»
# WITH PRIVATE KEY (FILE = «c:\Shipping\Certs\Shipping11.pvk»,
WITH SUBJECT = «Employers Access»,
EXPIRY_DATE = «10/31/2009»;
GO
У нас создался сертификат! Теперь его можно без проблем использовать для
размещения в таблице зашифрованных записей, выполняя привычные SQL-запросы:
INSERT INTO .
values(N»ДАННЫЕ ДЛЯ ЗАШИФРОВКИ’,
EncryptByCert(Cert_ID(«andrej»), @cleartext));
GO
В этом примере неформатированный текст из переменной @cleartext шифруется
сертификатом с именем «andrej». Зашифрованные данные помещаются в таблицу
«ТАБЛИЦА». Уточню, что данные могут быть расшифрованы только с помощью
соответствующего закрытого ключа (как уже было сказано, «приватного»).
Имя функции для обратного преобразования угадать несложно: DecryptByCert(). А
вот синтаксис более хитер, и с ним все чуть сложнее. Дело в том, что на
приватный ключ, как правило, закладывается дополнительный пароль (passphrase).
Его необходимо ввести, и по этой причине он обязательно будет присутствовать в
коде запроса или процедуры. Это не очень хорошо, потому что в этом случае его
можно быстро увести. Но с этим мы разберемся позже, когда поговорим о
безопасности хранимых процедур. А пока – код для извлечения данных из
шифрованной базы данных:
SELECT convert(nvarchar(max), DecryptByCert(Cert_Id(«andrej»),
ProtectedData, N»pGFD4bb925DGvbd2439587y»))
FROM .
WHERE Description
= N»Employers Access’;
GO
В этом примере производится выборка строк из таблицы .,
помеченных как «Employers Access». Пример дешифрует зашифрованный текст с
помощью закрытого ключа сертификата «Andrej» и дополнительного пароля
pGFD4bb925DGvbd2439587y. Расшифрованные данные преобразуются из типа varbinary в
тип nvarchar.
Надо сказать, что ассиметричные преобразования гораздо более накладны, чем
шифрование и дешифрование с использованием симметричного ключа. Поэтому
использование ассиметричного шифрования не рекомендуется при работе с большими
объемами данных, например, таблицами пользовательских данных
Это важно
учитывать при особо больших базах, а также базах, структура которых не приведена
к одной из нормальных форм
Вернемся к математике
Идея с ящиком, о которой я описывал выше, вдохновили Диффи и Хеллмана искать способ передачи сообщения. В конце концов они пришли к использованию односторонних функций.
Что такое односторонняя функция? К примеру есть функция удвоение, т.е удвоить(4)=8, она двухсторонняя, т.к. из результата 8 легко получить исходное значение 4. Односторонняя функция — та функция после применения которой практически невозможно получить исходное значение. К примеру смешивание желтой и синей краски — пример односторонней функции. Смешать их легко, а вот получить обратно исходные компоненты — невозможно. Одна из таких функций в математике — вычисление по модулю.
За основу алгоритма Хеллман предложил функцию Yx (mod P). Обратное преобразование для такой функции очень сложно, и можно сказать что, по сути, заключается в полном переборе исходных значений.
К примеру вам сказали, что 5 x (mod 7) = 2, попробуйте найдите x, а? Нашли? А теперь представьте что за Y и P взяты числа порядка 10300.
Кстати сказать, для повышения стойкости, число P должно являться простым числом, а Y — являться первообразным корнем по модулю P. Но так как мы все же пытаемся понять теорию, то смысла заморачиваться на этом я не вижу.
Симметричное шифрование
Симметричное шифрование – это алгоритм шифрования, в котором используется один и тот же криптографический ключ как для шифрования, так и для расшифровки данных. Рассмотрим на PHP шифрование данных симметричным методом на основе алгоритма AES (Advanced Encryption Standard) – симметричного алгоритма блочного шифрования (размер блока 128 бит, ключ 128/192/256 бит). AES является одним из самых распространённых алгоритмов симметричного шифрования..
PHP шифрование данных AES
Как уже говорилось ранее, для шифровки и расшифровки потребуется ключ шифрования. Это может быть любая строка, но мы для его получения воспользуемся функцией, которая генерирует строку псевдослучайных байт длиной 40, и преобразуем полученный результат в шестнадцатеричное представление:
На экран будет выведен результат следующего вида:
Полученное значение мы будем использовать как секретный ключ шифрования и дешифрования данных (он должен храниться в тайне). Запишем его в переменную $key:
Теперь определим, что мы будем кодировать. Для первого примера возьмем обычную строку:
Мы будем шифровать данные алгоритмом AES с 192 битным ключом:
Все доступные методы шифрования можно посмотреть следующим образом:
Имея данные для шифрования $data, выбранный метод $method и секретный ключ $key в PHP симметричное шифрование данных мы можем осуществить с помощью функции openssl_encrypt:
Выведем на экран результат с помощью var_dump($encrypted):
Чтобы расшифровать полученное значение, необходимо воспользоваться обратной функцией openssl_decrypt:
Опять воспользуемся var_dump($decrypted):
Конечный листинг примера симметричного шифрования/расшифровки данных на PHP будет следующий:
PHP шифрование файлов AES
В PHP шифрование файлов от шифрования данных отличается лишь тем, что содержимое файла сначала необходимо прочитать, проделать с ним необходимые операции, а затем – записать.
Создадим обычный текстовый файл в текущей директории:
Ключ и метод шифрования мы возьмем из предыдущего примера, а данные для кодирования получим из файла aes.txt с помощью функции file_get_contents:
Закодируем содержимое файла и запишем его в новый файл aes-encrypted.txt с помощью функции file_put_contents:
Посмотрим содержимое полученного файла:
Осталось попробовать расшифровать этот файл и записать его:
Проверяем результат:
Конечный листинг симметричного шифрования файла на PHP алгоритмом AES:
Решение:
Для решения этой задачи существуют специальные инструменты.
mysqldump, mysqlhotcopy
Все СУБД имеют в своем составе собственные средства для получения резервной копии (дампа) базы данных. Это mysqldump для mysql, pg_dump для postgresql и т.п.
В качестве одного из возможного варианта решения этой задачи мы рекомендуем использовать утилиту mysqlhotcopy.
Утилита mysqlhotcopy представляет собой Perl-сценарий, использующий SQL-команды LOCK TABLES, FLUSH TABLES и Unix-утилиты cp или scp для быстрого получения резервной копии базы данных.
Подробности по ссылкам внизу статьи.
Еще более проработанное решение — утилита AutoMySQLBackup
AutoMySQLBackup
AutoMySQLBackup с базовой конфигурации может создавать ежедневные, еженедельные и ежемесячные резервные копии баз данных MySQL с одного или нескольких серверов MySQL.
Прочие функции:
- Уведомление по электронной почте
- Сжатие и шифрование копий
- Управление правилами ротации
- Инкрементальные резервные копии
Порядок установки в CentOS:
Например:
mkdir ~/tmp1 cd ~/tmp1 wget http://downloads.sourceforge.net/project/automysqlbackup/AutoMySQLBackup/AutoMySQLBackup%20VER%203.0/automysqlbackup-v3.0_rc6.tar.gz tar -xzf automysqlbackup-v3.0_rc6.tar.gz ./install.sh
Порядок установки в Debian / Ubuntu:
Пакет automysqlbackup есть в репозиториях debian и усттановка производится командой:
apt-get install automysqlbackup
Для настройки можно использовать глобальный файл параметров (/etc/automysqlbackup/automysqlbackup.conf) или создать отдельный конфиг для каждого задания, например — /etc/automysqlbackup/myserver.conf
2. Откройте в любимом текстовом редакторе файл /etc/automysqlbackup/myserver.conf, раскомментруйте и укажите необходимые вам параметры.
Наиболее важные — имя, пароль и где хранить архивы:
CONFIG_mysql_dump_username='root' CONFIG_mysql_dump_password='mega_password' CONFIG_backup_dir='/var/backup/db' CONFIG_mail_address='[email protected]'
Каждый параметр описан в конфигурационном файле, изучите его не спеша.
Большинство параметров закомментировано символом #. Если вас устраивает значение по умолчанию оставьте параметр как есть, если нужно изменить значение, то нужно убрать # и задать желаемое значение.
Уделите внимание разделу «Rotation Settings» в конфигурационном файле если у вас особые правила ротации бэкапов.
Глобальные параметры automysqlbackup в Debian находятся в файле /etc/default/automysqlbackup
Запуск automysqlbackup
Если просто выполнить команду automysqlbackup, то он будет выполнена с параметрами из файла /etc/automysqlbackup/automysqlbackup.conf
Если вы создали для каждой базы данных отдельный конфиг, то можно выполнить команду с указанием конкретного конфига:
automysqlbackup -c /etc/automysqlbackup/myserver.conf
Для выполнения в фоновом режиме, что подходит для заданий cron лучше использовать:
automysqlbackup -bc /etc/automysqlbackup/myserver.conf
Пример задания для cron (делать бэкап ежедневно в 4:22):
22 4 * * * root /usr/local/bin/automysqlbackup -bc /etc/automysqlbackup/myserver.conf
Убедитесь, что путь к исполняемому файлу у вас именно такой
Восстановление базы данных
Если база данных удалена, то создайте новую. Пример команды создания базы данных.
mysqladmin -u USER -pPASSWORD create NEWDATABASE
Выберите нужный файл и декопрессируйте его и загрузите в базу данных. В зависимости от выбранного в конфиге automysqlbackup архиватора (компрессора) используйте соответствующую утилиту — gunzip для file.gz (или bunzip2 для file.bz2)
Это можно сделать одной командной конструкцией:
Для архивов gzip:
gunzip < /path/to/backupfile.sql.gz | mysql -u USER -pPASSWORD DATABASE
или так
zcat /path/to/backupfile.sql.gz | mysql -u USER -pPASSWORD DATABASE
Для архивов bzip2
bunzip2 < /path/to/backupfile.sql.bz2 | mysql -u USER -pPASSWORD DATABASE
или так
bzcat /path/to/backupfile.sql.bz2 | mysql -u USER -pPASSWORD DATABASE
Механизм блокирования в MySQL
Одновременный доступ нескольких клиентов к хранилищу данных может приводить к ошибкам различного типа. Например, одновременное чтение одним клиентом и запись другим клиентом одной и той же строки таблицы с большой вероятностью приведет к сбою или чтению некорректных данных. Механизмы блокировок позволяют избежать ситуаций одновременного доступа к данным, регламентируя механизм взаимодействия пользователей между собой.
MySQL от имени одного из клиентов накладывает блокировку на определенный ресурс, при этом другие клиенты ждут освобождения блокировки. Блокировка может быть на уровне таблиц (блокируется таблица) или на уровне строк (блокируются определенные строки таблицы). В механизме хранения MyISAM (используемом по умолчанию) реализована табличная блокировка, а в механизме InnoDB построчная. Построчная блокировка достигается посредством усложнения структуры хранилища: в MyISAM структура файла с данными представляет собой простое перечисление строк таблицы, тогда как хранилище InnoDB структурировано и поддерживает мультиверсионность данных. Поэтому, InnoDB выигрывает в приложениях, в которых происходит многопоточное изменение данных в одну и ту же таблицу, несмотря на необходимые потери на обслуживание более сложного хранилища.
Блокировки бывают двух видов: на чтение и на запись.
- Если A хочет читать данные, то другие клиенты тоже могут читать данные, но никто не может записывать, пока А не закончит чтение (read lock).
- Если А хочет записать данные, то другие клиенты не должны ни читать ни писать эти данные пока А не закончит(write lock).
Блокировка может быть наложена явно или неявно.
- Если клиент не назначает блокировку явным образом, MySQL сервер неявно устанавливает необходимый тип блокировки на время выполнения выражения или транзакции. Например, в случае выполнения оператора SELECT сервер установит READ LOCK, а в случае UPDATE — WRITE LOCK. При неявной блокировке уровень блокировки зависит от типа хранилища данных: для MyISAM, MEMORY и MERGE блокируется вся таблица, для InnoDB — только используемые в выражении строки (в случае, если набор этих строк может быть однозначно определен значениями первичного ключа — иначе, блокируется вся таблица).
- Часто возникает необходимость выполнения нескольких запросов подряд без вмешательства других клиентов в это время. Неявная блоктровка не подходит для этих целей, так как устанавливается только на время выполнения одного запроса. В этом случае клиент может явно назначить, а потом отменить блокировку с помощью выражений LOCK TABLES и UNLOCK TABLES. Явной блокировка всегда блокирует всю таблицу, независимо от механизма хранения.
Рекомендации
Ниже приведены рекомендации по настройке Key Vault при использовании шифрования данных с помощью ключа, управляемого клиентом.
Установите блокировку ресурсов в Key Vault, чтобы управлять правами на удаление этого критически важного ресурса и предотвратить случайное или несанкционированное удаление.
Включите функции аудита и отчетности для всех ключей шифрования. Key Vault предоставляет журналы, которые можно легко передать в любые средства управления информационной безопасностью и событиями безопасности
Например, они уже интегрированы в службу Azure Monitor Log Analytics.
Убедитесь, что Key Vault и База данных Azure для MySQL находятся в одном регионе, чтобы обеспечить быстрый доступ к операциям упаковки или распаковки ключа DEK.
Сделайте Azure KeyVault доступным только для частной конечной точки и ряда определенных сетей и используйте для защиты ресурсов только доверенные службы Майкрософт.
Ниже приведены рекомендации по настройке ключа, управляемого клиентом.
-
Храните копию управляемого клиентом ключа в надежном месте или передайте ее в службу депонирования.
-
Если ключ создается в Key Vault, создайте резервную копию ключа перед его первым использованием. Резервную копию можно восстановить только в Key Vault. Дополнительные сведения о команде резервного копирования см. в статье Backup-AzKeyVaultKey.
Асимметричное шифрование
асимметричный алгоритм предполагает под собой наличие двух ключей — публичного и приватного. То есть сообщение шифруется публичным ключом, а расшифровывается приватным и ни как иначе. Собственно именно эту концепцию сформулировал Диффи.
В общем суть данного алгоритма заключается в том, что принимающая сторона перед приемкой сообщения генерирует пару ключей на основе алгоритма модульной арифметики (принцип такой же как и в алгоритме Диффи-Хеллмана), собственно приватный и публичный ключ. Отправитель перед отправкой получает публичный ключ и шифрует сообщение данным ключом, после чего данное сообщение можно расшифровать только приватным ключом, который хранится в секрете у принимающей стороны.
Если вернуться к аналогии с замками, то шифрование с открытым ключом можно представить себе следующим образом:
Есть несколько алгоритмов реализующих асимметричное шифрование. Самый известный из них — RSA. Расписывать его я не вижу смысла, так как понять как он работает с ходу все равно не получится, да и лучше чем написано на википедии я написать все равно не смогу.
CREDHIST
Этот файл размещён по пути «%appdata%\Microsoft\Protect\CREDHIST», он полезен только для контекста не-домен. Этот файл:
- содержит: предыдущие зашифрованные учётные данные пользователя (SHA1 и NTLM)
- используется для: расшифровки мастер ключей
- защищён: хешем SHA1 самого последнего пользовательского пароля, используемого пользователем на этой системе
- каждый пункт защищён предыдущим ключом и т.д.
Чтобы просмотреть свойства этого файла выполните команду:
dpapi::credhist /in:"%appdata%\Microsoft\Protect\CREDHIST"
Пример вывода:
**CREDHIST** dwVersion : 00000001 - 1 guid : {86cddf31-2b68-42fb-a6e6-28b628228fc8} dwNextLen : 00000000 - 0
Я пытался расшифровать этот файл в mimikatz командой:
dpapi::credhist /in:"Z:\files\CREDHIST" "/password:qweqwe123" /sid:S-1-5-21-4099021954-1290662600-116018068-1003
Алгоритм работы MySQL
Одно или несколько устройств (клиентов) подключаются к серверу по определенной сети. Любой из них может сделать запрос из графического интерфейса пользователя (GUI) на своем мониторе. Сервер покажет требуемый результат, если все идет строго по инструкции. Основные процессы, происходящие в среде MySQL (если не вдаваться в технические тонкости), одинаковы:
- MySQL создает БД для хранения и управления данными, определяющими отношения каждой таблицы.
- Клиенты запрашивают информацию, путем ввода определенных команд SQL на MySQL.
- Приложение сервера выдает клиенту запрошенные сведения.
Клиенты обычно выбирают подходящий им MySQL GUI. Чем проще и удобнее графический пользовательский интерфейс, тем быстрее и легче станут происходить операции по управлению данными. Наиболее популярные графические интерфейсы MySQL: SequelPro, MySQL WorkBench, DBVisualizer и Navicat DB Admin Tool.
Какие-то из них бесплатны, а некоторые распространяются на коммерческой основе. Одни работают на всех ОС, а другие только на MacOS. Соответственно каждый пользователь должен подобрать GUI под свои нужды. Чтобы управлять базами данных MySQL, в том числе на сайте WordPress, наиболее очевидным подходом является phpMyAdmin.
Восстановление и репликация с помощью управляемого клиентом ключа в Key Vault
После шифрования Базы данных Azure для MySQL с помощью управляемого ключа клиента, хранящегося в Key Vault, все создаваемые копии сервера также шифруются. Новую копию можно создать с помощью операции локального восстановления или геовосстановления либо с помощью реплик чтения. Копию можно изменить в соответствии с новым управляемым клиентом ключом, используемым для шифрования. При изменении ключа, управляемого клиентом, старые резервные копии сервера начинают использовать последний ключ.
Чтобы избежать возникновения проблем при настройке шифрования управляемых клиентом данных во время восстановления или создания реплики чтения, необходимо выполнить следующие действия на исходном и восстановленном сервере или сервере-реплике.
- Запустите процесс восстановления или создания реплики чтения в исходной Базе данных Azure для MySQL.
- Оставьте созданный сервер (восстановленный сервер или сервер-реплику) в недоступном состоянии, так как его уникальному удостоверению еще не предоставлены разрешения для Key Vault.
- На восстановленном сервере или сервере-реплике повторно проверьте ключ, управляемый клиентом, в параметрах шифрования данных, чтобы созданному серверу были предоставлены разрешения на упаковку и распаковку ключа, хранящегося в Key Vault.
5 последних уроков рубрики «PHP»
Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак
В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение
В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
4 Сравнение хранимых процедур и операторов SQL
Преимущество:
1. Повышение производительности Операторы SQL анализируются и компилируются при создании процесса. Хранимая процедура предварительно скомпилирована. Когда хранимая процедура запускается в первый раз, оптимизатор запросов анализирует и оптимизирует ее и дает план хранения, который, наконец, сохраняется в системной таблице, так что эти накладные расходы могут быть сохранены, когда процедура выполнена.2. Уменьшите накладные расходы на сеть. При вызове хранимой процедуры вам нужно только указать имя хранимой процедуры и необходимую информацию о параметрах, тем самым уменьшая сетевой трафик.3. Упростите перенос кода. Специалисты по базам данных могут изменить хранимую процедуру в любое время, но это не влияет на исходный код приложения, что значительно улучшает переносимость программы.4. Повышенная безопасность 1) Системный администратор может ограничить полномочия выполняемой хранимой процедуры, чтобы не допустить доступа неавторизованных пользователей к данным. 2) При вызове процесса по сети виден только вызов процесса выполнения. Следовательно, злоумышленники не могут видеть имена таблиц и объектов базы данных, встраивать собственные операторы Transact-SQL или искать ключевые данные. 3) Использование параметров процесса помогает избежать атак SQL-инъекций. Поскольку ввод параметров обрабатывается как буквальные значения, а не как исполняемый код, злоумышленнику будет сложнее вставлять команды в операторы Transact-SQL внутри процедуры и нарушать безопасность. 4) Процесс может быть зашифрован, что помогает скрыть исходный код.
Недостатки:
1. Хранимые процедуры требуют, чтобы специализированные разработчики баз данных поддерживали 2. Изменения в логике проектирования, изменение хранимых процедур не так гибко, как SQL
Почему хранимые процедуры относительно редко используются в практических приложениях? Обычно при разработке проекта используется относительно мало хранимых процедур. Почему это так? Причины анализа следующие: 1) Специального разработчика базы данных нет, обычные программисты выполняют операции с базой данных неполный рабочий день. 2) Программистам часто требуется только работать с программой для завершения доступа к данным, без необходимости разработки на базе базы данных. 3) Требования к проекту часто меняются, и операторы SQL удобно изменять, особенно когда речь идет об изменении логики.
Как выбрать между хранимой процедурой и оператором SQL? Основываясь на реальном опыте работы с приложением, даются следующие рекомендации:
1. В некоторых проектах с высокой эффективностью или высокими требованиями к стандартам рекомендуется использовать хранимые процедуры. 2. Рекомендуется использовать параметризованные команды для общих проектов, что является компромиссом между хранимыми процедурами и операторами SQL. 3. Для некоторых алгоритмов, требующих относительно высоких требований и использующих несколько логик данных, рекомендуется использовать хранимые процедуры.
Примеры использования Percona Server
В следующих примерах будет показано, как создать базу данных с одной таблицей и внести в неё изменения, а также как создать пользователя и дать ему привелегии на доступ к базе данных.
Пример 1
- 1. Подключение к серверу в качестве root-пользователя (необходимо ввести пароль, указанный при установке):
$ mysql -u root -p
- 2. Создание новой базы данных:
mysql> CREATE DATABASE testdb;
- 3. Переход к созданной базе данных:
mysql> use testdb;
- 4. Создание новой таблицы:
mysql> CREATE TABLE Users ( -> Id int NOT NULL, -> Name varchar(255), -> Email varchar(255), -> Note varchar(255), -> PRIMARY KEY (Id) -> );
- 5. Добавление новой записи в таблицу:
mysql> INSERT INTO Users (Id, Name, Email, Note) -> VALUES (1, 'John Doe', '[email protected]', 'TEST USER');
- 6. Отображение записей в таблице:
mysql> SELECT * FROM Users;
- 7. Удаление базы данных:
mysql> DROP DATABASE testdb;
Пример 2
- 1. Подключение к серверу в качестве root-пользователя (необходимо ввести пароль, указанный при установке):
$ mysql -u root -p
- 2. Создание новой базы данных:
mysql> CREATE DATABASE blog;
- 3. Создание нового пользователя и назначение ему пароля для подключения:
mysql> CREATE USER 'jeff'@'localhost' IDENTIFIED BY 'mysecretone';
- 4. Предоставление ему привилегий на доступ к базе данных:
mysql> GRANT ALL PRIVILEGES ON blog.* TO 'jeff'@'localhost';
- 5. Применение изменений:
mysql> FLUSH PRIVILEGES;
- 6. Отключение от сервера:
mysql> quit;
- 7. Подключение к серверу под именем созданного пользователя:
$ mysql -u jeff -pmysecretone
- 8. Переход к базе данных blog:
mysql> use blog;
Transact-SQL
Кроме рассмотренных выше методов симметрического шифрования (это когда для шифрования и дешифровки используется одинаковый пароль), существует так же асимметрическое шифрование. Сама идея в асимметричной криптографии заключается в том, что существует 2 ключа: открытый и закрытый (секретный). Они необходимы для того, чтобы одним из них, открытым — шифровать, а вторым — расшифровывать. Решение заключается в том, что расшифровать данные есть возможность только секретным ключом, (который парный открытому).
К примеру на Microsoft SQL Server-ах можно использовать Transact-SQL. Это процедурное расширение для языка SQL. Оно дает возможность управлять операторами, локальными переменными, дополнительными функциями.
EncryptByCert как раз является одной из таких функций. Она позволяет ассиметрично шифровать с использованием сертификатов. Сам сертификат, в данной связке, является открытым ключом. Где взять такой сертификат? Ответ очевиден — самостоятельно генерировать используя другую функцию. Например, следующий код создаст сертификат для пользователя Vasia.
Получив сертификат, можем модифицировать SQL-запросы. Запросы будут выглядеть следующим образом:
Текст из переменной @cleartext зашифровывается сертификатом с именем Vasia. Данные попадают в Таблицу. Стоит напомнить, что расшифровывать необходимо с помощью парного закрытого ключа. Для этого используется функция DecryptByCert.
Пример SQL-запроса для расшифровки:
Тут правда не всё так просто. В сам запрос, в открытом виде добавляется пароль, без которого расшифровать данные невозможно. Это не есть хорошо. Но и это поправимо. Об этом речь пойдет дальше.
Запрос делает выборку из Таблицы, у которой поле Description равно ‘data encrypted by certificate’. Хранимые бинарные данные преобразуются в строковые.
Стоит заметить, что шифрование таблиц баз данных асимметричным методом является более затратным, чем то же шифрование/дешифровка используя симметричный ключ. Это стоит учитывать, если собираетесь применить метод на таблицы с большими объемами данных. И делать выборку по ним. Например для пользовательских данных.
Linux
Возможно несколько вариантов установки сервера БД, рассмотрим их.
MariaDB
Для установки MariaDB на Linux, Вы можете воспользоваться предусмотренным системой способом установки. Например, для Linux с пакетным менеджером yum:
yum update yum install mariadb-server mariadb-client
Для Linux с пакетным менеджером apt:
apt-get update apt-get install mariadb-server mariadb-client
MariaDB из репозитария MariaDB
Пример для Debian 9 и MariaDB 10.2
apt-get install software-properties-common dirmngr apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xF1656F24C74CD1D8 add-apt-repository 'deb http://ams2.mirrors.digitalocean.com/mariadb/repo/10.2/debian stretch main' apt-get update apt-get install mariadb-server mariadb-client
Пример для CentOS 7 и MariaDB 10.2
{ \ echo ''; \ echo 'name = MariaDB'; \ echo 'baseurl = http://yum.mariadb.org/10.2/centos7-amd64'; \ echo 'gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB'; \ echo 'gpgcheck=1'; \ } > /etc/yum.repos.d/MariaDB.repo yum install MariaDB-server MariaDB-client
MySQL
Пример для Debian или Ubuntu
Выполните:
curl -fsSL https://dev.mysql.com/get/mysql-apt-config_0.8.9-1_all.deb -o mysql-apt-config.deb dpkg -i mysql-apt-config.deb
выберите версию MySQL, нажмите OK, затем:
apt-get update apt-get install mysql-server mysql-client
При установке Вам предложат указать пароль для пользователя root MySQL.
Пример для CentOS 7, Red Hat Enterprise Linux 7
wget http://repo.mysql.com/mysql57-community-release-el7.rpm rpm -ivh mysql57-community-release-el7.rpm yum update yum install mysql-server mysql-client
Функции криптографии
Для многих станет открытием, что MySQL поддерживает базовые криптографические функции для алгоритмов AES и DES. Такие функции обеспечивают высокий уровень безопасности, особенно алгоритм AES, и их рекомендуется использовать для улучшения устойчивости приложений ко взлому.
-
AES_ENCRYPT(string, key) и AES_DECRYPT(string, key);
-
DES_ENCRYPT(string, key) и DES_DECRYPT(string, key);
-
ENCODE(string, key) и DECODE(string, key);
SELECT AES_DECRYPT( AES_ENCRYPT('текст для шифрования', 'ключ'), 'ключ') as encryption; -- OUTPUT: текст для шифрования
Описание: Запрос выводит ту же самую строку, которую мы отправляли на шифрование, потому что как только произошло шифрование строки, тут же мы производим дешифрование в оригинальный текст.
и представляют собой наиболее устойчивый криптографический алгоритм, который доступен в MySQL.