Академия Специальных Курсов по Компьютерным Технологиям
    Главная страница Послать письмо
 
AskIt.ru  
   
   
   
   
   
   
 
 
  Главная / Заказные курсы / Microsoft SQL Server 2005 для администраторов
 
 

Получить учебные материалы по этому курсу


<-- Назад Читать дальше -->

5.6.4. Создание сертификатов и ключей и применение криптографических функций

Шифрование данных в SQL Server 2005, криптографические функции, CREATE CERTIFICATE, CREATE ASYMMETRIC KEY, CREATE SYMMETRIC KEY, ENCRYPT BY

Представьте себе простую задачу. У вас есть база данных DB1, а в ней — таблица dbo.SecretTable с единственным столбцом Secret типа nvarchar:

USE DB1;

GO

CREATE TABLE dbo.SecretTable(Secret nvarchar(100));

Вам нужно поместить в эту таблицу текстовую информацию, зашифрованную при помощи сертификата.

Первое, что вам потребуется сделать, — создать сертификат. Это можно сделать при помощи команды CREATE CERTIFICATE. Самый простой вариант этой команды выглядит так:

USE DB1;

CREATE CERTIFICATE SelfSignedCert1

   ENCRYPTION BY PASSWORD = 'P@ssw0rd'

   WITH SUBJECT = Проверка шифрования',

   START_DATE = '03/10/2006';

Обратите внимание, что для создания сертификата вам не требуется никакой центр сертификации — все необходимые средства уже встроены в SQL Server. Однако вы вполне можете загрузить в базу данных сертификат, который был сгенерирован внешним центром сертификации и сохранен в файле (в отдельном файле должен находиться частный ключ), например:

USE DB1;

CREATE CERTIFICATE ExternalCert1

   FROM FILE = 'C:\Certificates\Cert1.cer'

   WITH PRIVATE KEY (FILE = 'C:\Certificates\Cert1Key.pvk',

   DECRYPTION BY PASSWORD = 'P@ssw0rd);

GO

Кроме этого, уже готовый сертификат можно также извлечь из подписанной этим сертификатом сборки .NET или из подписанного исполняемого файла. Параметр DECRYPTION BY PASSWORD позволяет указать пароль, который был использован для защиты данного сертификата.

Параметр ENCRYPTION BY PASSWORD определяет пароль, который потребуется для расшифровки данных, защищенных сертификатом (для шифрования данных он не нужен). Если этот параметр пропустить, то создаваемый сертификат будет автоматически защищен главным ключом базы данных (Database Master Key). Автоматически этот ключ не создается. Чтобы получить возможность работать с ним, нужно предварительно его создать:

USE DB1;

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssw0rd';

Кроме пароля, главный ключ базы данных автоматически защищается также главным ключом службы (Service Master Key). Этот ключ автоматически генерируется SQL Server 2005 в процессе установки. Будьте очень внимательны при использовании главного ключа базы данных: если вы переустановите сервер (а, следовательно, изменится главный ключ службы), зашифрованные данные могут быть потеряны. Чтобы этого не случилось, нужно производить регулярное копирование базы данных master или экспортировать главный ключ службы в файл при помощи команды BACKUP SERVICE MASTER KEY.

Обязательный параметр SUBJECT команды CREATE CERTIFICATE определяет цель выдачи сертификата (его значением заполняется соответствующее поле сертификата в соответствии со стандартом X.509v1).

После того, как сертификат создан, его можно использовать для шифрования данных. Для этой цели применяется специальная функция EncryptByCert:

INSERT INTO SecretTable

   values(EncryptByCert(Cert_ID('SelfSignedCert1'), N'Секретные данные'));

Если какой-нибудь пользователь после этого произведет запрос к таблице SecretTable, результаты могут его удивить (рис. 5.11).

Рис. 5.11. Результат выполнения запроса к зашифрованным данным

Обратите внимание, что функция EncryptByCert принимает в качестве первого параметра не имя сертификата, а его идентификатор. Требуемый идентификатор легко получить при помощи функции Cert_ID.

Расшифровка зашифрованных данных производится при помощи функции DecryptByCert. Единственная проблема при работе с этой функцией заключается в том, что она возвращает расшифрованную информацию с использованием типа данных varbinary, поэтому нужно будет произвести преобразование этого типа данных в nvarchar:

SELECT (Convert(Nvarchar(100), DecryptByCert(Cert_ID('SelfSignedCert1'), Secret, N'P@ssw0rd'))) FROM SecretTable;

Первый параметр, который принимает функция DecryptByCert, — идентификатор сертификата, возвращаемый той же функцией Cert_ID, второй параметр — строковое значение (или переменная, или, как в нашем случае, имя столбца), третий параметр — пароль, которым был защищен сертификат при его создании.

Работа с асимметричным ключом выглядит практически аналогично. Вначале нужно создать асимметричный ключ:

CREATE ASYMMETRIC KEY AsymKey1

   WITH ALGORITHM = RSA_512

   ENCRYPTION BY PASSWORD = 'P@ssw0rd';

Обратите внимание, что при создании асимметричного ключа, кроме пароля, требуется указать длину создаваемого ключа. В вашем распоряжении три варианта: 512, 1024 и 2048 бит.

После этого при помощи созданного ключа вы можете производить шифрование данных:

INSERT INTO SecretTable

   values(EncryptByAsymKey(AsymKey_ID('AsymKey1'), N'Секретные данные'));

И их расшифровку:

SELECT (Convert(Nvarchar(100), DecryptByAsymKey(AsymKey_ID('AsymKey1'),Secret, N'P@ssw0rd'))) FROM SecretTable;

При использовании симметричных ключей шифрование производится быстрее, чем при применении асимметричных алгоритмов, поэтому при работе с большими объемами данных рекомендуется использовать именно их. Применение симметричных ключей выглядит очень похоже. Правда, есть и небольшие отличия. Во-первых, при создании симметричного ключа его можно защищать не только паролем, но и другим симметричным ключом, асимметричным ключом или сертификатом. Во-вторых, при создании симметричного ключа вы можете указать один из восьми алгоритмов шифрования, поддерживаемых SQL Server 2005 (DES, TRIPLE_DES, RC2, RC4, DESX, AES_128, AES_192, AES_256). Само создание симметричного ключа может выглядеть так:

CREATE SYMMETRIC KEY SymKey1

   WITH ALGORITHM = AES_128

   ENCRYPTION BY PASSWORD = 'P@ssw0rd';

Перед использованием ключа (для шифрования или расшифровки данных) его нужно обязательно открыть. Это достаточно сделать только один раз в течение сеанса работы пользователя:

OPEN SYMMETRIC KEY SymKey1 DECRYPTION BY PASSWORD = 'P@ssw0rd';

А дальше используем его привычным способом. Отличаются только названия функций:

INSERT INTO SecretTable

   values(EncryptByKey(Key_GUID('SymKey1'), N'Секретные данные'));

GO

Обратите внимание, что при расшифровке данных нет необходимости передавать функции DecryptByKey имя симметричного ключа и пароль. Будут автоматически подставляться данные открытого при помощи команды OPEN SYMMETRIC KEY ключа:

SELECT (Convert(Nvarchar(100), DecryptByKey(Secret))) FROM SecretTable;

SQL Server 2005 позволяет производить шифрование данных также просто при помощи пароля. Для этого используется функция EncryptByPassPhrase. В самом простом варианте она принимает только пароль и данные, которые необходимо зашифровать:

INSERT INTO SecretTable

   values(EncryptByPassphrase('P@ssw0rd', N'Секретные данные'));

GO

Расшифровка производится при помощи функции DecryptByPassphrase:

SELECT (Convert(Nvarchar(100), DecryptByPassphrase('P@ssw0rd', Secret))) FROM SecretTable;

 

   
   
   
   
   
   
   
   
   
   
 
<-- Назад Читать дальше -->

Получить учебные материалы по этому курсу


 
© 2004-2008, Академия Специальных Курсов
по Информационным Технологиям
.
Все права защищены.

Разработка NevaStudio
г. Санкт-Петербург, Васильевский остров,
20-я линия, д. 7
Офис 101, 2-й этаж
Телефон: 8(812)922-47-60
E-mail: info@askit.ru