简而言之,我的目标是将加密的消息字符串在一个 SQL Server 数据库之间传输到另一个数据库。数据库驻留在同一台服务器中,但是我有这个非常精确的设计要求。
我在数据库中使用几个表来发送和接收(加密)消息。
我偶然发现的奇怪问题是,我无法在另一个数据库中破译(解密)消息。这样做时我得到一个 NULL 。这很奇怪,我不知道出了什么问题,因为我在这个话题上的知识有限,尽管我设法做到了这一点。
起初我使用的是基于 sql server 证书的加密和解密。DBA 必须分别在两个不同的数据库中创建对称密钥和证书。这让我觉得这可能是另一端解密不成功的原因。
但是,后来我想尝试一些简单的东西,所以我使用了 SQL Server 的密码短语功能。结果还是一样,解密返回NULL。
这是代码
首先,我在两个数据库中创建了函数。请注意,密码是相同的。
Note: These functions are created in both the databases Database1 and Database2
CREATE FUNCTION [dbo].[Fn_EncryptByPassphrase] (@PlaintextMessage NVARCHAR(Max))
RETURNS VARBINARY(Max)
AS
BEGIN
DECLARE @Passphrase NVARCHAR(Max) = 'testpassphrase'
,@EncryptedMessage VARBINARY(Max)
SET @EncryptedMessage = EncryptByPassphrase(@Passphrase, @PlaintextMessage)
RETURN @EncryptedMessage
END
CREATE FUNCTION [dbo].[Fn_DecryptByPassphrase] (@EncryptedMessage VARBINARY(Max))
RETURNS NVARCHAR(Max)
AS
BEGIN
DECLARE @Passphrase NVARCHAR(Max) = 'testpassphrase'
,@PlaintextMessage NVARCHAR(Max)
SET @PlaintextMessage = CONVERT(NVARCHAR(MAX), DecryptByPassphrase(@Passphrase, @EncryptedMessage))
RETURN @PlaintextMessage
END
以下是表格:
Database1
Create Table [dbo].[Outbound]
(Id INT,
Message NVARCHAR(Max),
EncryptedMessage VARBINARY(Max))
Database2
Create Table [dbo].[Inbound]
(Id INT,
InboundMessageId INT,
EncryptedMessage VARBINARY(Max))
这是用例:
USE Database2
INSERT INTO [dbo].[Inbound] (
InboundMessageId
,[EncryptedMessage]
)
SELECT Id
,EncryptedMessage
FROM [Database1].[dbo].[Outbound]
WHERE Id = 208
DECLARE @Message NVARCHAR(Max) = ''
,@Encrypted VARBINARY(Max)
SELECT @Encrypted = EncryptedMessage
FROM dbo.Inbound
WHERE InboundMessageId = 208
这返回 NULL
SELECT [dbo].[Fn_DecryptByPassphrase](@Encrypted)
这也返回 NULL。尽管我使用了与加密相同的密码。唯一的区别是,我使用密码短语加密来自 Database1 的消息,然后我使用相同的密码短语在 Database2 解密,这会产生 NULL。
DECLARE @Passphrase NVARCHAR(Max) = 'testpassphrase'
SELECT Convert(NVARCHAR(Max), DecryptByPassphrase(@Passphrase, @Encrypted))
这看起来很奇怪!我不确定这是否是正常行为,如果是,是否有解决方法?
更新:
有人认为我提到的用例在两个数据库之间不起作用吗?因为如果解密是从同一个数据库中完成的,我可以解密内容。奇怪的!!
更新 2
DBA 已经获得了基于证书的加密 - 解密工作。但是,本文中提到的基于密码的代码仍然无法正常工作。尽管我遇到了一个问题,但我仍然会为基于密码的解密寻找解决方案。请发布您的解决方案。