SQL Server:我能在nvarchar列中保存二进制数据吗?

4
我知道您可以将二进制数据转换为nvarchar并保存在nvarchar列中,然后在检索时将其转换回二进制。这样做是否能始终正确地给您原始的二进制数据?或者在转换过程中会出现什么问题?
我之所以问这个问题,是因为我们有一个nvarchar列,用于以明文形式保存密码。我希望将其更改为以加密文本形式保存密码。如果我使用函数EncryptByPassPhrase,它会返回varbinary。我想知道是否可以将从EncryptByPassPhrase输出的内容直接转换为nvarchar并保存在同一Password列中。这比创建一个新的varbinary类型的列来保存加密密码要容易得多。
因此,我建议像这样转换当前密码:
UPDATE Users 
SET Password = CONVERT(nvarchar(200), EncryptByPassPhrase('whatever', Password))

然后我会解密并检索出密码,如下所示:
SELECT CONVERT(nvarchar(200), DecryptByPassPhrase('whatever', Password)) AS PW 
FROM Users

这个会一直正常运行吗?

提前感谢!


6
不应该对密码进行加密,而是应该对其进行哈希处理,然后比较哈希的结果。 - podiluska
1
同样,您不应该加密密码,而应该使用盐哈希它们,并比较哈希结果。在 SQL Server 中,二进制数据属于 VARBINARY 列,而不是 NVARCHAR。 - Remus Rusanu
1个回答

0

不考虑这是否是一个好主意,以下查询似乎表明所有的两个字节组合都可以正确地往返。

WITH T1 AS
(
SELECT 
      TOP 65536 CAST(ROW_NUMBER() OVER (ORDER BY (SELECT 0)) - 32769 AS SMALLINT) RN
FROM master..spt_values v1, master..spt_values v2
), T2 AS 
(
SELECT CAST(CAST(RN AS BINARY(2)) AS NCHAR(1)) AS NC,
       RN
FROM T1 
)
SELECT *
FROM T2 
WHERE CAST(CAST(NC AS BINARY(2)) AS SMALLINT) <> RN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接