MS SQL Server 2005 - 不区分大小写的密码问题

时间:2009-04-25 10:18:54

标签: sql-server-2005

我正在检查用于登录MS SQL SERVER 2005中的过程的用户名和密码。由于SQL Server 2005不区分大小写,即使用户提供小写密码而不是大写密码,系统也允许登录。

我该怎么办?在Sql Server 2005中是否有任何命令可以检查相同的??

5 个答案:

答案 0 :(得分:3)

使用区分大小写的排序规则 - 例如

...where Password = @password COLLATE SQL_Latin1_General_CP1_CS_AS

是的,您不应该将纯文本密码存储在数据库中!

答案 1 :(得分:1)

永远不会存储纯文本密码!存储密码的哈希并进行比较。您可以使用HashBytes()功能。

答案 2 :(得分:0)

SQL Server 2005仅使用不区分大小写的比较进行默认排序规则。您不应将密码存储在纯文本中。您应该使用合理安全的散列算法对它们进行散列并存储散列。 (也许你应该真的使用salt值,但让我们从散列开始)。

答案 3 :(得分:0)

使用区分大小写的collation进行比较,例如:

SELECT
  Id
FROM
  UserTable
WHERE
  UserName = @UserName
  AND Password = @Password COLLATE SQL_Latin1_General_Cp1_CS_AS

使用与密码列的字符集匹配的归类。

另一个注意事项 - 您确定要在数据库中存储明文密码吗?在安全决策方面,这在“不应该做的事情”中名列前五。

答案 4 :(得分:-2)

在某些情况下,您可能希望存储明文密码,因此我不会重复其他人的建议,尽管它通常是合理的。

除了设置排序规则外,您还可以使用varbinary技巧:

WHERE
  CAST(Password as varbinary(20)) = CAST(@Password as varbinary(20)) AND
  CAST(Username as varbinary(20)) = CAST(@Username as varbinary(20))

以上内容也会导致区分大小写的搜索 - 只需记住将varbinary长度设置为与字段长度相同。

为了避免索引扫描,您也可以包括不区分大小写的搜索 - 它将进行索引搜索并在之后执行varbinary搜索:

WHERE
  Password = @Password AND
  Username = @Username AND
  CAST(Password as varbinary(20)) = CAST(@Password as varbinary(20)) AND
  CAST(Username as varbinary(20)) = CAST(@Username as varbinary(20))