 | Уровень сложности: средний Маной Мохан, конструктор-разработчик безопасности программного обеспечения, IBM Линетт Д. Адияламурьил, инженер по разработке IDS Security Software, IBM
20.10.2009 В статье рассматривается возможность шифрования данных на уровне столбцов таблиц (CLE), доступная в IBM Informix® Dynamic Server (IDS) версии 10 и более поздних.
Introduction
В современном мире, в основе которого лежит электронная коммерция, безопасность баз данных представляет наивысший приоритет для их пользователей. Повсеместно и постоянно современные предприятия сталкиваются с необходимостью защиты ценной информации от хакеров. С другой стороны, современные государственные и федеральные постановления, касающиеся защиты личных данных, также стимулируют компании к использованию методик шифрования для защиты баз данных. Шифрование данных на уровне столбцов таблиц (для краткости CLE) - одна из таких методик, которая позволят шифровать данные в конкретных столбцах таблиц баз данных.
CLE
С выходом IDS v10 у пользователей появилась возможность усовершенствовать конфиденциальность данных благодаря основанному на SQL решению CLE. Эта возможность предоставляет встроенный SQL-интерфейс для наиболее популярных симметричных алгоритмов шифрования. Таких, как Triple-Data Encryption Standart (TDES) и Advanced Encryption Standart (AES). Новые встроеные SQL-функции обеспечивают для храниения данных в столбцах в зашифрованном формате.
Реализация CLE в IDS не обеспечивает управления ключами. Поэтому задача по управлению ключами ложится на приложения, либо пользователей. При использовании CLE данные шифруются с использованием ключа, генерируемого по паролю через встроенные SQL-функции шифрования. Пароль может быть установлен на уровне сессии при помощи выражения SET ENCRYPTION или в качестве аргумента к функциям шифрования. Зашифрованные данные могут быть извлечены или модифицированы только при указанном в запросе пароле. IDS предоставляет пользователям простой способ запоминания паролей - при помощи подсказок. При настройке шифрования данных по паролю может быть указана подсказка. Подсказку можно увидеть используя специальную встроенную SQL-функцию. Пароли и подсказки не хранятся открытым текстом в какой-либо таблице системного каталога. Ключ, используемый в процессе - случайное значение, зависящее от текущего времени. СУБД инициализирует ключ при старте сервера. При выключении сервера ключ уничтожается.
Для шифрования IDS использует специальный виртуальный процессор encrypt VP, который занимается собственно шифрованием и дешифрованием. Параметр конфигурации VPCLASS вместе с ключевым словом может быть использован для конфигурирования encrypt VP. Если параметр VPCLASS не сконфигурирован, СУБД запускает encrypt VP автоматически при первом вызове любой функции шифрования/дешифрования, определенных для CLE. Encrypt VP также может быть добавлен динамически при помощи утилиты onmode.
Конфигурирование encrypt VP
Ниже представлен пример использования параметра конфигурации:
Пример использования утилиты onmode для динамического добавления encrypt VP:
Встроенные SQL-функции и выражения, предназначенные для CLE
Ниже представлен список функциональностей, поддерживаемых CLE:
-
ENCRYPT_TDES: Данная функция возвращает значение, которое является результатом шифрования символьной строки, или BLOB/CLOB значения. Шифрование первого аргумента функции производится алгоритмом TDES (или DES3).
ENCRYPT_TDES(data-string-expression [, password-string [, hint ]])
|
-
ENCRYPT_AES: Функция ENCRYPT_AES возвращает зашифрованное значение, полученное в результате обработки первого аргумента алгоритмом AES. Первый аргумент должен быть незашифрованной строкой символов, либо smart large object (тип данных BLOB или CLOB).
ENCRYPT_AES(data-string-expression [, password-string [, hint ]])
|
-
DECRYPT_CHAR: Функция DECRYPT_CHAR в качестве первого аргумента принимает зашифрованную строку символов любого символьного типа данных (CHAR, LVARCHAR, NCHAR, NVARCHAR, или VARCHAR). Пароль должен быть указан в качестве второго аргумента, если только пароль не совпадает с паролем сессии, установленным выражением
SET ENCRYPTION.
Decrypt_char(EncryptedData [, Password])
|
-
DECRYPT_BINARY: Функция DECRYPT_BINARY принимает в качестве первого аргумента принимает зашифрованный большой объект типа BLOB или CLOB. Пароль должен быть указан вторым аргументом если только пароль не совпадает с паролем сессии, установленным выражением
SET ENCRYPTION.
Decrypt_binary(EncryptedData [, Password])
|
-
GETHINT: Функция GETHINT возвращает строку символов, указанную ранее в качестве подсказки в выражении
SET ENCRYPTION PASSWORD для шифрования с помощью функции ENCRYPT_AES или ENCRYPT_TDES. Эта подсказка обычно предоставляет информацию, которая может помочь пользователю указать нужный пароль для получения расшифрованных данных с помощью функции DECRYPT_CHAR или DECRYPT_BINARY.
-
SET ENCRYPTION PASSWORD: Данная функция используется для определения либо сброса пароля сессии для шифрования/дешифрования символов, BLOB- или CLOB-объектов. Только IDS поддерживает данное выражение, которое является расширением стандартов ANSI/ISO для SQL. Это выражение может быть использовано в ESQL/C.
SET ENCRYPTION PASSWORD "password" [ WITH HINT "hint-string" ]
|
Use CLE in a dbaccess application
Следующий пример иллюстрирует использование алгоритма шифрования AES и функции decrypt_char , входящих в состав CLE, в среде приложения dbaccess. В данном примере данные шифруются с помощью алгоритма AES с указанием пароля mypassword1 and mypassword2, которые используются в качестве ключа шифрования. Если какой-либо другой пользователь попытается извлечь эти данные, он получит лишь зашифрованный вариант, лишенный всякого смысла. Но если операция SELECT>выполняется с использованием функции дешифрования (например decrypt_char) с указанным верным паролем, то пользователь увидит вполне осмысленные расшифрованные данные.
Листинг 1. Использование AES и decrypt_char в приложении dbaccess
create database test with log;
Database created.
create table tab (custname char(32), ccard char(16), enc_ccard lvarchar(3000));
Table created.
insert into tab values ("Manoj Mohan", "1234567890",
encrypt_aes("1234567890", "mypassword1"));
1 row(s) inserted.
insert into tab values ("Lynette Daniel", "2345678901",
encrypt_aes("2345678901", "mypassword2"));
1 row(s) inserted.
select * from tab;
custname Manoj Mohan
ccard 1234567890
enc_ccard 0gH//AAAAEAWnTjoJu721chtLzYumGZUshGnfI2elmV
custname Lynette Daniel
ccard 2345678901
enc_ccard 0Sbb/AAAAEAy4rjGrXe6wqETDb3d/thwySlcjVWYttH
2 row(s) retrieved.
select custname, ccard, decrypt_char(enc_ccard, "mypassword1")
as clear_ccard from tab where custname="Manoj Mohan";
custname Manoj Mohan
ccard 1234567890
clear_ccard 1234567890
1 row(s) retrieved.
select custname, ccard, decrypt_char(enc_ccard, "mypassword2")
as clear_ccard from tab where custname="Lynette Daniel";
custname Lynette Daniel
ccard 2345678901
clear_ccard 2345678901
1 row(s) retrieved.
Database closed.
|
Использование CLE в ESQL/C-приложении
CLE также может быть использован в ESQL/C-приложении. В нижеследующем примере приводится пример использования алгоритма шифрования TDES и функции дешифрования decrypt_binary.
Листинг 2. ESQL/C-приложение, использующее TDES и decrypt_binary
#include <stdio.h>
#include <decimal.h>
#include <datetime.h>
EXEC SQL include sqlda;
EXEC SQL include sqlca;
EXEC SQL include sqltypes;
main()
{
EXEC SQL BEGIN DECLARE SECTION;
int id;
lvarchar a[3000], b[3000];
EXEC SQL END DECLARE SECTION;
EXEC SQL drop database test;
printf("SQLCODE %d\n", SQLCODE);
EXEC SQL create database test with log;
printf("SQLCODE %d\n", SQLCODE);
EXEC SQL create table tab (id int, credit_card lvarchar(3000),
encrypted_credit_card lvarchar(3000));
printf("SQLCODE %d\n", SQLCODE);
EXEC SQL insert into tab values (1, "1234567890",
encrypt_tdes("1234567890", "mypassword"));
printf("SQLCODE %d\n", SQLCODE);
EXEC SQL select id, credit_card, decrypt_binary(encrypted_credit_card, "mypassword")
into :id, :a, :b from tab;
printf("SQLCODE %d\n", SQLCODE);
printf("credit_card: %s, enc_credit_card %s\n", a, b);
}
|
Использование CLE для установки и получения подсказок
CLE также поддерживает подсказки, которые могут хранится наряду с паролями. Более того, пользователь может установить пароль для любой сесии с помощью синтаксиса SET ENCRYPTION PASSWORD . Это позволяет пользователям использовать выражение INSERT или SELECT без указания пароля для функций шифрования/дешифрования.
Листинг 3. Пример использования CLE для установки или получения подсказок
create database test with log;
Database created.
create table tab (custname char(32), ccard char(16), enc_ccard lvarchar(3000));
Table created.
set encryption password "VJTICOLLEGEMUMBAI" with hint "what is my PG College name?";
Encryption password set.
insert into tab values ("Manoj Mohan", "1234567890", encrypt_aes("1234567890"));
1 row(s) inserted.
select * from tab;
custname Manoj Mohan
ccard 1234567890
enc_ccard 0fIMgAAAAEAeliIJN4liR4qPCFw9//mIyq82berEiifNLgbd3vW23CVUzI3KSCy4kYQF
91PRuayfa3WpBpbTDQ=
1 row(s) retrieved.
select custname, gethint(enc_ccard) as hint from tab where custname="Manoj Mohan";
custname Manoj Mohan
hint what is my PG College name?
1 row(s) retrieved.
set encryption password "SOMAIYACOLLEGEMUMBAI" with hint "what is my Eng College name?";
Encryption password set.
insert into tab values ("Lynette Daniel", "2345678901", encrypt_aes("2345678901"));
1 row(s) inserted.
select custname, gethint(enc_ccard) as hint from tab where custname="Lynette Daniel";
custname Lynette Daniel
hint what is my Eng College name?
1 row(s) retrieved.
|
Требования CLE к хранению данных
Зашифрованные данные, которые хранятся в символьных колонках в IDS, занимают больше места нежели незашифрованные данные. Например, если введенные данные имеют длину N байт, то соответствующий шифр AES будет занимать:
Листинг 4. Пример расчета требуемого места для CLE
AES = B64(NGM(N, 16) + H + 8) + 11
Где,
H = 0 при отсутствии подсказки; H = 40 при наличии подсказки.
NGM(x,y): Следующий множитель для y, который больше, чем x = ((x + y) / y) * y
B64(x) : Base-64 размер шифрования = ((x + 2) / 3) * 4
|
Аналогично рассчитывается требуемое место для шифра TDES:
TDES = B64(NGM(N, 8) + H + 8) + 11
Где,
H = 0 при отсутствии подсказки; H = 40 при наличии подсказки.
NGM(x,y): Следующий множитель для y, который больше, чем x = ((x + y) / y) * y
B64(x) : Base-64 размер шифрования = ((x + 2) / 3) * 4
|
Требования к хранению данных для AES и TDES
Следующая таблица иллюстрирует зависимость занимаемого шифром места от различных условий и методов шифрования (AES и TDES), рассчитанных согласно вышеприведенным формулам.
Таблица 1. Место, требуемое для шифров AES и TDES
| Размер данных (байт) | TDES (без подсказки) | AES (без подсказки) | TDES (с подсказкой) | AES (с подсказкой) |
|---|
| 1..7 | 35 | 43 | 87 | 99 | | 8..15 | 43 | 43 | 99 | 99 | | 16..23 | 55 | 67 | 107 | 119 | | 24..31 | 67 | 67 | 119 | 119 | | 32..39 | 75 | 87 | 131 | 139 | | 40..47 | 87 | 87 | 139 | 139 | | 100 | 163 | 171 | 215 | 227 | | 200 | 299 | 299 | 355 | 355 | | 500 | 695 | 707 | 747 | 759 |
Следует помнить, что шифрование является очень ресурсоемкой операцией и ее применение может существенно снизить производительность. Поэтому ее стоит применять только при необходимости.
Поддерживаемые типы данных
CLE поддерживает шифрование всех встроенных типов данных, кроме BYTE и TEXT. Поддерживаемые типы данных включают в себя: CHAR, VARCHAR, NCHAR, NVARCHAR, LVARCHAR, SMALLINT, INTEGER, INT8, DECIMAL, SMALLFLOAT, FLOAT, DATE, DATETIME, INTERVAL, BOOLEAN, BLOB, CLOB. Зашифрованные данные хранятся в полях типа CHAR, VARCHAR или LVARCHAR. Зашифрованные данные типов BLOB и CLOB хранятся в BLOB-полях.
Комплексные типы данных, такие как Collection и Row, также могут быть зашифрованы. Но их шифрование требует их явного преобразования. Например:
ENCRYPT_AES(LIST{1,3,2}::LVARCHAR, 'PassWord')
DECRYPT_CHAR(enc_list, 'PassWord')::LIST(INT NOT NULL)
|
Определенные пользователем DISTINCT типы шифруются также как и базовые типы данных. Определенные пользователем непрозрачные (opaque) типы данных требуют их явного преобразования в или из LVARCHAR.
Заключение
CLE предоставляет встроенные SQL интерфейс для хорошо зарекомендовавших себя симметричных алгоритмов шифрования, таких как Triple-DES и AES. В данной статье были представлен обзор того, как пользователи могут использовать CLE с целью повышения безопасности, конфиденциальности и целостности данных.
Благодарности
Авторы выражают благодарность архитектору Джонатану Леффлеру за любезно предоставленную им презентацию о CLE, которая очень помогла в подготовке данной статьи.
Ресурсы Научиться
Получить продукты и технологии
- Создайте свой следующий проект с помощью IBM trial software, доступного для скачивания напрямую с developerWorks.
Обсудить
Об авторах  | |  | Маной Мохан (Manoj Mohan) работал разработчиком в команде IBM-IDS пять лет. У него есть опыт проектирования и внедрения съемного модуля аутентифиации (Pluggable Authentication Module) и IP V6 поддержки в IDS сервер. Также у него есть опыт проектирования и внедрения поддержки доверительного контекста в DB2 для Linux, UNIX и Windows. |
 | |  | Линетт Адияламурьил вот уже более девяти лет работает с IDS в качестве инженера. Она обладает огромным опытом в областях безопасности и kernel. |
Выскажите мнение об этой странице
|  |