3

Existe-t-il un moyen de chiffrer les valeurs de cellule en fonction du compte d'utilisateur? Alors que:MSSQL2012 crypte les cellules au niveau de l'utilisateur

  • Seuls les utilisateurs valides peuvent déchiffrer les valeurs de certaines cellules?
  • Ou, un moyen de crypter les données par l'authentification de l'utilisateur, de sorte que seul le bon utilisateur va le décrypter?

Pour l'instant c'est ma solution: je crée des clés asymétriques, et j'accorde des utilisateurs dessus. Ce n'est pas bon parce que:

  1. Je dois créer une clé pour chaque utilisateur ou groupe d'utilisateurs;
  2. Il ne peut pas être atomique;
  3. La requête pour les données lues doit toujours récupérer le nom de la clé.

Exemple:

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

Quelle version de sql utilisez-vous? Si vous jouez avec l'aperçu de 2016, vous devriez regarder cette fonctionnalité. http://blogs.microsoft.com/next/2015/05/27/always-encrypted-sql-server-2016-includes-new-advances-that-keeps-data-safer/#sm.000n5aecc10nrfkuxaz24umzkk4q0 – Igor

+0

Version 2012. Je vais mettre à jour le post. Merci – Radioleao

Répondre

0

Gardez une table avec les noms d'utilisateur et si la colonne correspondante est Chiffré pour eux ou non. Utilisez une fonction de valeur table avec l'utilisateur comme paramètre et, en fonction du tableau ci-dessus, déterminez les colonnes à chiffrer ou non.

Quelque chose comme:

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

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

-je ajouter le tableau suivant

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 

Ce code est tiré de votre message et modifié.

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

la ASYMETRIQUE KEY est une pour tout enregistrement

CREATE ASYMMETRIC KEY [Encrypt_Key_Radioleao] WITH ALGORITHM = RSA_2048 

créer table avec des données et des données de sélection (j'ai changé votre structure de table juste pour contenir le mot, si u besoin de conserver les données cryptées , u peut faire qu'en changeant ma logique un peu)

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

maintenant de la requête

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

L'OP demande comment simplifier le chiffrement, pas comment déterminer qu'un champ est chiffré –

+0

@PanagiotisKanavos La question est: Existe-t-il un moyen de chiffrer les valeurs de cellule en fonction du compte de l'utilisateur? Donc dans ma solution, je dis quelque chose comme ce qui suit: Sélectionnez Case lorsque UserSeeEncrypted = 1 puis Sinon, .... Je vais ajouter cela à l'enswer – Srinika

+0

Ce code ne crypte pas ou ne décrypte rien –