3

Есть ли способ зашифровать значения ячеек на основе учетной записи пользователя? Таким образом:MSSQL2012 шифрует ячейки на уровне пользователя

  • Только действительные пользователи могут расшифровать значения некоторых ячеек?
  • Или способ шифрования данных по аутентификации пользователей, поэтому только правильный пользователь расшифрует его?

На данный момент это мое решение: я создаю асимметричные ключи и предоставляю пользователям их. Это не хорошо, потому что:

  1. Я должен создать один ключ для каждого пользователя или группы пользователей;
  2. Он не может быть атомарным;
  3. Запрос на чтение данных должен всегда запрашивать имя ключа.

Пример:

create database test_for_encrypt 
Go 
use test_for_encrypt 
Go 

-- Create Master key and certificate 
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'StrongPass1234'; 
CREATE CERTIFICATE MySelfSignedCert 
WITH SUBJECT = 'MySelfSignedCert', 
EXPIRY_DATE = '07/14/2020'; 

-- Create Asymmetric keys 
CREATE ASYMMETRIC KEY Asym_user_1 WITH ALGORITHM = RSA_2048 
CREATE ASYMMETRIC KEY Asym_user_2 WITH ALGORITHM = RSA_2048 

-- create table with data and select data 
create table tb_encrypt (word nvarchar(100), asymkey nvarchar(100), crypt varbinary(1000)) 
Go 
insert tb_encrypt (word, asymkey) values (N'One', N'Asym_user_1'), (N'Two', N'Asym_user_2') 
update tb_encrypt set crypt = ENCRYPTBYASYMKEY(ASYMKEY_ID(asymkey), word) 
select word, crypt, convert(nvarchar, DECRYPTBYASYMKEY(ASYMKEY_ID(asymkey), crypt)) as decrypt 
from tb_encrypt 


-- create new user with grants 
create login [user_asym] With password = N'password_1234' 
CREATE USER [user_asym] FOR login [user_asym] 
ALTER AUTHORIZATION ON SCHEMA::[db_datareader] TO [user_asym] 
GRANT CONTROL ON ASYMMETRIC KEY::[Asym_user_1] TO [user_asym] 
ALTER ROLE [db_datareader] ADD MEMBER [user_asym] 

-- After this, Logout and Login with [user_asym] 
-- Select data with user [user_asym] 
select word, crypt, convert(nvarchar, DECRYPTBYASYMKEY(ASYMKEY_ID(asymkey), crypt)) as decrypt 
from tb_encrypt 
+2

Какую версию sql вы используете? Если вы играете с предварительным просмотром 2016 года, вы должны посмотреть на эту функцию. http://blogs.microsoft.com/next/2015/05/27/always-encrypted-sql-server-2016-includes-new-advances-that-keeps-data-safer/#sm.000n5aecc10nrfkuxaz24umzkk4q0 – Igor

+0

Версия 2012. Я собираюсь обновить сообщение. Спасибо – Radioleao

ответ

0

Keep таблицу с именами пользователей и зашифрована ли соответствующий столбец для них или нет. Используйте функцию с таблицей с пользователем в качестве параметра и на основе указанной таблицы определите столбцы, которые должны быть зашифрованы или нет.

Что-то вроде:

Select Case when UserSeeEncrypted = 1 then <EncryptedVal> 
Else <Decrypted> .... 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~

Я добавляю следующую таблицу

Create Table #Users (UserName varchar(100), IsEncrypted bit) 
Insert into #Users 
Select 'PrasadPC\Prasad', 1 -- this is my username for my machine (i used to test) 
Union 
Select 'user2', 0 
Union 
Select 'user3', 1 

select * from #Users 

Этот код взят из вашего поста и модифицирована.

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'StrongPass1234'; 
CREATE CERTIFICATE MySelfSignedCert 
WITH SUBJECT = 'MySelfSignedCert', 
EXPIRY_DATE = '07/14/2020'; 

асимметричной KEY один для любой записи

CREATE ASYMMETRIC KEY [Encrypt_Key_Radioleao] WITH ALGORITHM = RSA_2048 

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

create table #tb_encrypt (word nvarchar(100)) 
Go 
insert #tb_encrypt (word) values (N'One'), (N'Two') 

Теперь запрос

select Word, 
Case when exists 
(Select UserName from #Users 
where IsEncrypted = 0 and SUSER_SNAME() = UserName) then Word 
Else 
convert(nvarchar(max), ENCRYPTBYASYMKEY(ASYMKEY_ID('Encrypt_Key_Radioleao'), 
Word)) End as En_Decrypt 
from #tb_encrypt e 

-- change My user to see decrypted data, 
Update #Users set IsEncrypted = 0 where UserName = 'PrasadPC\Prasad' 
+0

OP спрашивает, как упростить шифрование, а не как определить, что поле зашифровано –

+0

@PanagiotisKanavos Вопрос: Есть ли способ зашифровать значения ячеек на основе учетной записи пользователя? Так что в моем решении я говорю примерно следующее: Выберите случай, когда UserSeeEncrypted = 1 then Else .... Я добавлю это в ответ – Srinika

+0

Этот код не шифрует и не расшифровывает что-либо –

Смежные вопросы