0

简而言之,我的目标是将加密的消息字符串在一个 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 已经获得了基于证书的加密 - 解密工作。但是,本文中提到的基于密码的代码仍然无法正常工作。尽管我遇到了一个问题,但我仍然会为基于密码的解密寻找解决方案。请发布您的解决方案。

4

0 回答 0