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

Sql server 2005 MS SQL Server 2005-不区分大小写的密码问题,sql-server-2005,Sql Server 2005,我正在MS SQL SERVER 2005中的一个过程中检查登录的用户名和密码。由于SQL Server 2005不区分大小写,即使用户提供的密码是小写而不是大写,系统也允许登录 我该怎么办??Sql Server 2005中是否有任何命令可以检查相同的内容???Sql Server 2005仅通过默认排序规则使用不区分大小写的比较。您不应以明文形式存储密码。您应该使用合理安全的散列算法对它们进行散列,并存储散列。(也许你真的应该使用salt值,但让我们从散列开始)。使用区分大小写的排序规则-例

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


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

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

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

...where Password = @password COLLATE SQL_Latin1_General_CP1_CS_AS

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

从不存储纯文本密码!存储密码的散列并进行比较。您可以使用该功能。

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

SELECT
  Id
FROM
  UserTable
WHERE
  UserName = @UserName
  AND Password = @Password COLLATE SQL_Latin1_General_Cp1_CS_AS
使用与密码列的字符集匹配的排序规则


一个是另一个注释-您确定要在数据库中存储明文密码吗?当涉及到安全决策时,这是五大禁忌之一。

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

除了设置排序规则外,还可以使用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))

你能举一个例子,把密码存储为明文是有效的吗?它必须在一个我永远不会使用的系统中,因为在我想让你知道我的密码的地方没有有效的例子。例如,与遗留系统的互操作性。我想说的是,一个人可能有理由存储明文而不是散列它——我真的认为没有理由有10个答案都给出了相同的建议,而没有为OP的问题提供一个直接的解决方案。@Rory-我从来没有建议md5--HashBytes()支持几个sha变体。但是现在它仍然很旧-它不支持bcrypt,如果你不使用bcrypt,你就做错了。是的-它是v。古老的我想这个答案是从4月10日开始的,不是从09年4月开始的。bcrypt一路:-)