如何从数据库中获取解密数据?

时间:2016-11-17 20:37:37

标签: c# sql asp.net encryption

我想使用加密来保护数据库中的敏感数据。我已经使用Symmetric Key和Certificate with AES_256算法加密了SQL数据库中的数据。现在问题是我不知道如何在我的ASP.NET应用程序中处理加密/解密部分。我可以从用户收到一个字符串,我应该能够解密字符串并检查它是否等于数据库中的某个加密值。

我得到了钥匙

SELECT KEY_GUID('KeyName')

我的问题是如何使用此密钥在我的asp应用程序中处理解密部分。我曾尝试使用this,但它不起作用。

1 个答案:

答案 0 :(得分:1)

DECLARE @KeyName SYSNAME = 'keyName'

IF NOT EXISTS (SELECT * FROM sys.openkeys WHERE key_name = @KeyName)
BEGIN
    OPEN SYMMETRIC KEY keyName DECRYPTION BY CERTIFICATE certificateName;
END

DECLARE @WhatToEncrypt VARCHAR(400) = 'Something To Encrypt can be binary or character'

DECLARE @EncryptedBinary VARBINARY(MAX)
SET @EncryptedBinary = ENCRYPTBYKEY(KEY_GUID(@KeyName),@WhatToEncrypt)

DECLARE @DecryptedBinary VARBINARY(MAX)
SET @DecryptedBinary = DECRYPTBYKEY(@EncryptedBinary)

SELECT @WhatToEncrypt as Original, CAST(@DecryptedBinary AS VARCHAR(400)) as EncryptedThenDecrypted

--may want to add some logic to see if it was open and leave it open
CLOSE SYMMETRIC KEY keyName

当您使用如您所述的数据库加密技术时,需要在SQL端NOT ASP.Net端完成加密和解密。因此,要在C#中实现,您必须基本上传递适用的SQL语句,就像执行存储过程一样。

我建议您使用存储过程来打开和关闭密钥,然后只需使用函数ENCRYPTBYKEYDECRYPTBYKEY,因为您需要比较值等。

另请注意,两个加密函数也可以像盐一样传递验证数据。

ENCRYPTBYKEY - https://msdn.microsoft.com/en-us/library/ms174361.aspx

DECRYPTBYKEY - https://msdn.microsoft.com/en-us/library/ms181860.aspx