存储在Varchar中的ENCRYPTBYPASSPHRASE值无法获取十六进制值SQL Server

时间:2013-08-20 17:35:10

标签: sql-server encryption sql-server-2008-r2

我正在使用SQLServer 2008 R2

有一个包含varchar字段的表。我们有一些第三方软件写入我们的数据库。我们无法控制它如何写入它。我们需要加密一些数据,以便工具加密必须写入varchar或类似文本字段的数据。在与供应商交谈之后,我们发现他们正在设置这样的领域

update <table>
Set <varchar_field> = ENCRYPTBYPASSPHRASE(N'<passphrase>', '<clear_text>')
Where <some_condition>

ENCRYPTBYPASSPHRASE返回VarBinary值。因此varbinary值设置为varchar字段。当我查看数据库时,看起来该字段是空白但是如果我运行。

SELECT
Cast(DECRYPTBYPASSPHRASE(N'<passphrase>', <varchar_field>)  AS NVARCHAR)
From <table>

我找回原来的价值。

我的问题是我想知道十六进制形式的加密值是什么样的。我似乎无法弄明白该怎么做。

我试过

Cast(<varchar_field> as varchar)

Convert(varchar, <varchar_field>)

他们都带着实际包含某些东西的空白值回来。 我想看看像0x0103939FFA0293。作为二进制的十六进制,是存储在varchar字段中的加密值。

更新答案

我曾经尝试过的是

Convert(varchar, <varchar_field>)

认为我需要将真正的二进制值转换为varchar,但我需要做的是将varchar转换为varbinary。转换为varbinary似乎让我得到了我需要的东西。

Convert(varbinary, <varchar_field>)

1 个答案:

答案 0 :(得分:1)

  1. ALWAYS, ALWAYS, ALWAYS define variable-length data types WITH AN EXPLICIT LENGTH

  2. 为什么要混用VARCHARNVARCHAR

  3. 要将二进制值视为字符串,您需要使用样式1:

    DECLARE @y VARBINARY(8000);
    
    SELECT @y = ENCRYPTBYPASSPHRASE(N'hello there', N'secret');
    
    SELECT AsBinary = @y, AsString = CONVERT(NVARCHAR(4000), @y, 1);