我有一个 SQL Server 2008 表,其结构类似于以下内容:
ID int PRIMARY KEY IDENTITY(1,1)
Name nvarchar(100)
LongText ntext
我想要实现的目标很简单。在此表中插入数据之前,我想使用 AES_192 算法对 LongText 进行加密。我正在使用以下 SP 来加密数据:
create proc sp_Encrypt_LongText
@rawText ntext = null,
@encryptedText nvarchar(max) output
as
begin
OPEN SYMMETRIC KEY Encryption_Symmetric_Key
DECRYPTION BY CERTIFICATE Encryption_Certificate WITH PASSWORD = 'mypassword'
set @encryptedText = ENCRYPTBYKEY(KEY_GUID(N'Encryption_Symmetric_Key'), cast(@rawText as nvarchar(max)))
CLOSE SYMMETRIC KEY Encryption_Symmetric_Key
end
为了解密,我创建了以下 SP:
alter proc sp_Decrypt_LongText
@encryptedText ntext = null,
@decryptedText varchar(max) output
as
begin
OPEN SYMMETRIC KEY Encryption_Symmetric_Key
DECRYPTION BY CERTIFICATE Encryption_Certificate WITH PASSWORD = 'mypassword'
set @decryptedText = cast(DECRYPTBYKEY(cast(@encryptedText as nvarchar(max))) as varchar(max))
CLOSE SYMMETRIC KEY Encryption_Symmetric_Key
end
当我使用 exec 命令时,程序似乎运行良好。到目前为止,一切都很好。问题是使用存储过程在表中插入和提取数据;插入和选择各一个。我现在拥有的内容如下:
插入:
create proc sp_InsertData
@Name nvarchar(100),
@LongText ntext = NULL
as
INSERT INTO TABLE tbl VALUES (@Name, @LongText)
用于获取
create proc sp_FindDataById
@Id int
as
SELECT ID, Name, LongText from tbl where ID=@Id
我的问题是,如何在这些 SP 中插入加密/解密程序以使它们正常工作?我已经研究了几篇文章来实现这一目标,但我不断遇到这样或那样的问题;主要是因为
ntext
数据类型。或者也许我在这里走错了路。感谢任何形式的帮助。
PS:由于DBA指定的某些原因,我无法将
LongText
的数据类型从ntext
更改为nvarchar
或varchar
。因此,所有的铸造都应用在程序中。
好的,所以我设法说服 DBA 将数据传输到具有 varbinary(max) 数据类型的新列。然后,我将这些值加密后传输到这个新列中,然后删除旧列并将新列重命名为旧列的名称。花了一些工作,但现在一切都进展顺利。我设法创建一个存储过程和两个函数来进一步模块化脚本。
用于打开对称密钥
CREATE PROCEDURE sp_OpenEncryptionKeys
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
OPEN SYMMETRIC KEY Encryption_Symmetric_Key
DECRYPTION BY CERTIFICATE Encryption_Certificate
END TRY
BEGIN CATCH
--catch
END CATCH
END
用于加密:
CREATE FUNCTION Encrypt
(
@ValueToEncrypt varchar(max)
)
RETURNS varbinary(max)
AS
BEGIN
-- Declare the return variable here
DECLARE @Result varbinary(max);
SET @Result = EncryptByKey(Key_GUID('My_Encryption_Symmetric_Key'), @ValueToEncrypt);
-- Return the result of the function
RETURN @Result
END
解密:
CREATE FUNCTION Decrypt
(
@ValueToDecrypt varbinary(max);
)
RETURNS varchar(max)
AS
BEGIN
-- Declare the return variable here
DECLARE @Result varchar(max);
SET @Result = DecryptByKey(@ValueToDecrypt);
-- Return the result of the function
RETURN @Result
END
用于插入
exec sp_OpenEncryptionKeys
INSERT INTO tbl VALUES ('Name', Encrypt('some text here'));
用于获取
exec sp_OpenEncryptionKeys
SELECT ID, Decrypt(LongText) from tbl;
希望这对某人有帮助。