MSSQL2012 verschlüsselt Zellen auf Benutzerebene

Gibt es eine Möglichkeit, Zellenwerte basierend auf Benutzerkonto zu verschlüsseln? Damit:

  • Nur die gültigen Benutzer können die Werte einiger Zellen entschlüsseln?
  • Oder ein path, um data durch Benutzerauthentifizierung zu verschlüsseln, also nur der richtige Benutzer wird es entschlüsseln?

Für jetzt ist das meine Lösung: Ich schaffe asymmetrische Schlüssel und gewähre ihnen die Benutzer. Es ist nicht gut, weil:

  1. Ich muss einen Schlüssel für jeden Benutzer oder jede Gruppe von Benutzern erstellen.
  2. Es kann nicht atomar sein
  3. Abfrage für Lesedaten muss immer den Schlüsselnamen abrufen.

Beispiel:

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 

    Halten Sie eine Tabelle mit Benutzernamen und ob die entsprechende Spalte für sie verschlüsselt ist oder nicht. Verwenden Sie eine Tabellenwertfunktion mit dem Benutzer als Parameter und basiert auf der obigen Tabelle, um die zu verschlüsselnden Spalten zu bestimmen.

    Etwas wie:

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

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

    Ich füge die folgende Tabelle hinzu

     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 

    Dieser Code wird von deinem Post genommen und geändert.

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

    Der ASYMMETRIC KEY ist einer für jeden Rekord

     CREATE ASYMMETRIC KEY [Encrypt_Key_Radioleao] WITH ALGORITHM = RSA_2048 

    erstellen Sie Tabelle mit data und wählen Sie data (ich änderte Ihre Tabellenstruktur nur, um das Wort zu halten, wenn Sie die verschlüsselten data behalten müssen, können Sie dies tun, indem Sie meine Logik ein wenig)

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

    Jetzt die Abfrage

     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'