我正在使用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>)
答案 0 :(得分:1)
ALWAYS, ALWAYS, ALWAYS define variable-length data types WITH AN EXPLICIT LENGTH
为什么要混用VARCHAR
和NVARCHAR
?
要将二进制值视为字符串,您需要使用样式1:
DECLARE @y VARBINARY(8000);
SELECT @y = ENCRYPTBYPASSPHRASE(N'hello there', N'secret');
SELECT AsBinary = @y, AsString = CONVERT(NVARCHAR(4000), @y, 1);