Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Просветите с шифрованием, пожалуйста.  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1165
Никогда не занимался, поэтому спрашиваю. По форуму смотрел темки, пока не нашел нужное.
Суть:
есть таблица Работники, в ней есть поле Зарплата (Money).

Посмотрел пример: SQL Server 2005 Books Online, How To: Encrypt a Column of Data,
но пока не врубился (так как я виду там пароль) как применить для моей Задачи:
1) чтоб ни программер, ни админ базы НЕ МОГЛИ видеть сами данные в этом поле на стороне сервера;
2) чтобы определенные юзеры могли вводить НЕКИЙ пароль при открытии формы/страницы с гридом работников, и после этого таблица открывалась с расшифрованными данными, юзер (нач.отдела кадров) мог менять значения в поле Зарплата, и сохранять. Чтоб при этом, ессно, данные снова зашифровались ЕМУ ИЗВЕСТНЫМ* паролем

*Допустим, пароль он распечатает и в сейф положит
1 авг 13, 20:20    [14650673]     Ответить | Цитировать Сообщить модератору
 Re: Просветите с шифрованием, пожалуйста.  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1165
Подробности "самообучения"

Берем пример и адаптируем его к текущей задаче:

--If there is no master key, create one now 
IF NOT EXISTS 
    (SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101)
    CREATE MASTER KEY ENCRYPTION BY 
    PASSWORD = '12345678910'
GO

CREATE CERTIFICATE EmployeeSalary
   WITH SUBJECT = 'Employee Salary';
GO

CREATE SYMMETRIC KEY SSN_Key_01
    WITH ALGORITHM = AES_256
    ENCRYPTION BY CERTIFICATE EmployeeSalary;
GO
-- Create a column in which to store the encrypted data
ALTER TABLE dbo.Employee
    ADD EncryptedSalary varbinary(128); 
GO
-- Open the symmetric key with which to encrypt the data
OPEN SYMMETRIC KEY SSN_Key_01
   DECRYPTION BY CERTIFICATE EmployeeSalary;
-- Encrypt the value in column Salary with symmetric 
-- key SSN_Key_01. Save the result in column EncryptedSalary.

UPDATE dbo.Employee
SET EncryptedSalary = EncryptByKey(Key_GUID('SSN_Key_01'), Salary);

GO

-- Verify the encryption.
-- First, open the symmetric key with which to decrypt the data

OPEN SYMMETRIC KEY SSN_Key_01
   DECRYPTION BY CERTIFICATE EmployeeSalary
GO
-- Now list the original ID, the encrypted ID, and the  decrypted ciphertext. If the decryption worked, the original
-- and the decrypted ID will match.
SELECT 
Salary
,Employee_ID
,EncryptedSalary AS [Enc Salary]
,CONVERT(nvarchar,DecryptByKey(EncryptedSalary)) AS [SalaryOpen]
FROM dbo.Employee


Если сделать это, то потом ЛЮБОЙ, кто запустит последний кусок - может открыть данные, обратившись к этому ключу

OPEN SYMMETRIC KEY SSN_Key_01
   DECRYPTION BY CERTIFICATE EmployeeSalary
GO
-- Now list the original ID, the encrypted ID, and the  decrypted ciphertext. If the decryption worked, the original
-- and the decrypted ID will match.
SELECT 
Salary
,Employee_ID
,EncryptedSalary AS [Enc Salary]
,CONVERT(nvarchar,DecryptByKey(EncryptedSalary)) AS [SalaryOpen]
FROM dbo.Employee


Хотелось сделать так, чтобы Нач отдела кадров мог менять пароль этого ключа, чтоб я не знал его.
Но толку не вижу, пусть он поменяет пароль внутри ключа, перекриптует данные. Но ведь все равно обращение и использование любым юзером этого ключа и исполнение select снова приведет к показу данных.
1 авг 13, 21:25    [14650794]     Ответить | Цитировать Сообщить модератору
 Re: Просветите с шифрованием, пожалуйста.  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1165
Есть ли какой мехнизм/способ обратиться/(блокировать исполнение) к этому куску

OPEN SYMMETRIC KEY SSN_Key_01
   DECRYPTION BY CERTIFICATE EmployeeSalary


с вводом пароля, использованного для создания самого ключа,
ну чтобы эта команда не исполнилась, если ввели неверный пароль?
1 авг 13, 21:49    [14650841]     Ответить | Цитировать Сообщить модератору
 Re: Просветите с шифрованием, пожалуйста.  [new]
aleks2
Guest
BOL:

OPEN SYMMETRIC KEY (Transact-SQL)

...
Permissions
The caller must have some permission on the key and must not have been denied VIEW permission on the key. Additional requirements vary, depending on the decryption mechanism:

DECRYPTION BY CERTIFICATE: CONTROL permission on the certificate and knowledge of the password that encrypts its private key.


DECRYPTION BY ASYMMETRIC KEY: CONTROL permission on the asymmetric key and knowledge of the password that encrypts its private key.


DECRYPTION BY PASSWORD: knowledge of one of the passwords that is used to encrypt the symmetric key.
..
Remarks
Open symmetric keys are bound to the session not to the security context. An open key will continue to be available until it is either explicitly closed or the session is terminated. If you open a symmetric key and then switch context, the key will remain open and be available in the impersonated context. Information about open symmetric keys is visible in the sys.openkeys (Transact-SQL) catalog view.

ЗЫ. ну и менять, канешно, могет.
2 авг 13, 08:43    [14651620]     Ответить | Цитировать Сообщить модератору
 Re: Просветите с шифрованием, пожалуйста.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Alexander2,

Я мало что понимаю в архитектурах безопасности, это совершенно не мой профиль.
Но, по моему скромному разумению, у вас есть два пути:
1) зашифровывать и расшифровывать данные на стороне клиента;
2) раз вам нужен пароль, то и использовать на стороне сервера шифрование по паролю: EncryptByPassPhrase, DecryptByPassPhrase. Для надёжности соединять клиент с сервером по SSL.

В любом из этих способов могут быть неведомые мне дыры, так что не помешала бы консультация человека, специализирующегося на безопасности.
2 авг 13, 10:55    [14652201]     Ответить | Цитировать Сообщить модератору
 Re: Просветите с шифрованием, пожалуйста.  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6175
Учитывая
Alexander2
1) чтоб ни программер, ни админ базы НЕ МОГЛИ видеть сами данные в этом поле на стороне сервера;

шифрование на стороне сервера отпадает. Наверное, в данном случае подойдет EncryptByPassPhrase, или шифрование на стороне клинета. Я бы выбрал последнее, т.к. EncryptByPassPhrase шифрует по Triple DES-128 - он считается устаревшим, и не особенно надежным. На клиенте больше вариантов: от AES с ключом по паролю (PKСS#5 PBKDF2) до RSA по Х509-сертификату.
2 авг 13, 11:21    [14652380]     Ответить | Цитировать Сообщить модератору
 Re: Просветите с шифрованием, пожалуйста.  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1165
Спасибо, уже разобрались.
Поразительно, что поиск по хелпу на слово Encrypt в выдаче первых 20 топиков дает How To: Encrypt a Column of Data.
Мы потом через полчаса после создания сообщения на форуме нашли, что на второй странице поиска есть EncryptByPassPhrase, то есть как раз то, что нужно.
2 авг 13, 18:03    [14656106]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить