我试图在两个函数中打开对称密钥。像这样:
CREATE FUNCTION DECRYPTDATA
(
@CipherText NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @Result NVARCHAR(MAX)
OPEN SYMMETRIC KEY MyKEY DECRYPTION BY CERTIFICATE MyCERT
SELECT @Result = CONVERT(VARCHAR(MAX),DECRYPTBYKEY(@CipherText))
RETURN @Result
END
GO
CREATE FUNCTION ENCRYPTDATA
(
@Text NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @Result NVARCHAR(MAX)
OPEN SYMMETRIC KEY MyKEY DECRYPTION BY CERTIFICATE MyCERT
SELECT @Result = ENCRYPTBYKEY(Key_GUID('MyKEY'),@Text)
RETURN @Result
END
GO
但是我收到了这个错误:
无效使用副作用操作符' OPEN SYMMETRIC KEY'在一个 功能
为什么会这样?
答案 0 :(得分:5)
实际上,您可以在功能中执行此操作,而无需使用DECRYPTBYKEYAUTOCERT功能打开对称密钥:
使用自动解密的对称密钥解密 证书。
以下示例演示了这一点:
CREATE MASTER KEY ENCRYPTION
BY PASSWORD = 'sm_long_password@'
GO
CREATE CERTIFICATE CERT_01
WITH SUBJECT = 'CERT_01'
GO
CREATE SYMMETRIC KEY SK_01
WITH ALGORITHM = AES_256 ENCRYPTION
BY CERTIFICATE CERT_01
GO
CREATE FUNCTION [dbo].[TEST] (@encryptedValue VARBINARY(256))
RETURNS NVARCHAR(128)
AS
BEGIN;
RETURN CONVERT(NVARCHAR(128),DECRYPTBYKEYAUTOCERT(CERT_ID('CERT_01'), NULL, @encryptedValue));
END
GO
DECLARE @encryptedValue VARBINARY(256);
OPEN SYMMETRIC KEY SK_01 DECRYPTION
BY CERTIFICATE CERT_01
SET @encryptedValue = ENCRYPTBYKEY(KEY_GUID('SK_01'), N'Stack Overflow')
CLOSE SYMMETRIC KEY SK_01;
SELECT [dbo].[TEST] (@encryptedValue);
DROP FUNCTION [dbo].[TEST];
DROP SYMMETRIC KEY SK_01;
DROP CERTIFICATE CERT_01;
DROP MASTER KEY;
答案 1 :(得分:4)
您可以在程序中执行多项操作,但无法在函数内部执行操作。基于Ben Cull的{{3}},你可以通过创建一个处理打开键并在使用函数之前调用它的过程来解决这个限制。
程序:
CREATE PROCEDURE OpenKeys
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
OPEN SYMMETRIC KEY MyKEY
DECRYPTION BY CERTIFICATE MyCERT
END TRY
BEGIN CATCH
-- Handle non-existant key here
END CATCH
END
然后在调用函数之前调用它。