2

不幸的是,我在数据库中有明文密码。我想尽可能少地传递这些纯文本值,例如比较和更新。为此,我试图创建一个排除明文密码的用户表视图,而是提供该密码的哈希值。

这是我当前的 SQL Server 视图,它不起作用:

SELECT CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt
       HashBytes('SHA1', PasswordSalt + u.Password) AS PasswordHash
FROM dbo.Users AS u

我很高兴听到这种方法的替代方案,但除此之外,问题似乎是将虚拟列PasswordSalt与..任何东西连接起来。例如,以下简单视图有效:

SELECT u.Login AS Column1, u.Login + 'b' AS Column2

但是这个没有:

SELECT u.Login AS Column1, Column1 + 'b' AS Column2

我从 Management Studio 收到的错误是

列名“Column1”无效。

提前感谢您对我做错了什么的任何想法!

4

2 回答 2

1

出现问题是因为语句的 FROM 子句表明要选择的数据来自 Users 表,但 SELECT 部分引用了名为 PasswordSalt 的列。SQL Server 在用户表中找不到具有此名称的列,因此出现错误。

另一种方法可能是在子查询中生成 Salt。例如

SELECT x.PasswordSalt,  HashBytes('SHA1', x.PasswordSalt + x.Password) AS PasswordHash FROM ( SELECT  CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt, Password FROM dbo.Users) x

于 2010-03-03T22:58:21.473 回答
1

关于什么

SELECT CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt 
       HashBytes('SHA1', CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) + u.Password) AS PasswordHash 
FROM dbo.Users AS u 
于 2010-03-03T23:17:55.223 回答