Among multiple methods given for securing data stored in the SQL Server database, even though the latest one which is Always Encrypted is available, we still use Keys. Passphrases and Certificates for encrypting data. When keys such as Symmetric Keys or Asymmetric Keys, or Passphrases are used for encrypting data, an additional parameter can be supplied which is called Authenticator. Since I recently used this for one of my database solutions, thought to make a note on it.
The following code creates a database and a table that holds Customers. The Security Code of the customer will be encrypted.
Let's insert some records.
OPEN SYMMETRIC KEY SalesKey DECRYPTION BY CERTIFICATE SalesCertificate ;
GO
INSERT INTO dbo.Customer
(Name, SecurityCode)
VALUES
('Dinesh', ENCRYPTBYKEY(KEY_GUID('SalesKey'), 'CUS005XZ'))
INSERT INTO dbo.Customer
(Name, SecurityCode)
VALUES
('Yeshan', ENCRYPTBYKEY(KEY_GUID('SalesKey'), 'CUS02ANX3'))
Once inserted, data will be looked like below;
And if I try to retrieve records, I need to decrypt encrypted values;
So far so good. Now let's try understand the usage of
Authenticator. Assume that
Yeshan needs to access some
Securables that can be accessed only by
Dinesh through an application
. For that, all
Yeshan needs is, log in to the application using
Dinesh's Security Code. Since he does not know
Dinesh's Security Code, one way of accessing the application using
Dinesh's account is, replacing the
Dinesh's code with his code. Let's see whether it is possible.
The following code updates
Dinesh's account with
Yeshan's code. And as you see, it gets updated and now
Yeshan can use
Dinesh account as he knows the code.
This should not be allowed and even if it is possible, what if we make sure that encrypted code cannot be replaced like that. That is what we can do with the
Authenticator.
Look at the following code. It passes two additional values for encrypting. The third one which is 1 says that this has an
Authenticator. The forth parameter is the data from which to derive an
Authenticator.
OPEN SYMMETRIC KEY SalesKey DECRYPTION BY CERTIFICATE SalesCertificate ;
GO
-- Update Security codes with CustomerId as the Authenticator
UPDATE dbo.Customer
SET SecurityCode = ENCRYPTBYKEY(KEY_GUID('SalesKey'), 'CUS005XZ', 1, Convert(varbinary(256), CustomerId))
WHERE CustomerId = 1;
UPDATE dbo.Customer
SET SecurityCode = ENCRYPTBYKEY(KEY_GUID('SalesKey'), 'CUS02ANX3', 1, Convert(varbinary(256), CustomerId))
WHERE CustomerId = 2;
Just like the previous code, values are encrypted now. However, if
Yeshan tried to do the same, see the result;
As you see, even though
Dinesh's code has been replaced with
Yeshan's code, when try to decrypt value of Dinesh, it results
null because
Authenticator is different. This is the usage of the
Authenticator.
Note that we used
CustomerId as the
Authenticator but you can use something else, something uncommon as the
Authenticator to make it more secured and avoid malicious activities like this.