【问题标题】:ENCRYPTBYPASSPHRASE value stored in Varchar can't get hex value SQL Server存储在 Varchar 中的 ENCRYPTBYPASSPHRASE 值无法获取十六进制值 SQL Server
【发布时间】:2013-08-22 21:15:39
【问题描述】:

我正在使用 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>)

【问题讨论】:

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


    【解决方案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);
      

    【讨论】:

    • 如果你在谈论这个转换为 NVARCHAR 我不知道第 3 部分工具在做什么但是如果我转换为 VARCHAR 我会得到一些奇怪的汉字字符如果我转换为 NVARCHAR 我得到恢复原值。我认为它与解密功能有关,而不是与字段中存储的内容有关。但我实际上必须转换为 VARBINARY 而不是 VARCHAR
    • 有趣的是,当我这样做时,情况正好相反:nvarchar 输出一些中文/亚洲象形文字,而 varchar 输出我的英文文本。
    猜你喜欢
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2013-04-18
    • 1970-01-01
    • 2011-10-04
    • 2012-10-07
    相关资源
    最近更新 更多