【问题标题】:MS SQL hashed password compare to plain textMS SQL 散列密码与纯文本比较
【发布时间】:2015-01-29 00:53:18
【问题描述】:

我想知道如何让我的小程序运行起来。我所需要的只是当我输入我的密码 Password321! 以与Password 列下的 MS SQL 数据库中的散列密码进行比较时,我尝试使用 PWDCOMPARE('Password321!', Password); 但它没有为我工作。它出现一个错误,提示 将 nvarchar 值 'nEg5JzRQHD8P7VOwwIkeaDx6WEs=' 转换为数据类型 int 时转换失败。 这是我的代码:

select Password from aspnet_Membership where Password=PWDCOMPARE('Password321!', Password);

请帮忙,

谢谢

M

【问题讨论】:

  • 只有在知道 password_hash 时才能使用 PWDCOMPARE('Password321!', Password)。因为 PWDCOMPARE 会将您的 text_format 密码与 password_hash 进行比较。即例如'SELECT SL.name,PWDCOMPARE('********',SL.password_hash) password_match FROM sys.sql_logins AS SL WHERE SL.name = 'ALogin';'

标签: java sql-server database encryption hash


【解决方案1】:

对于SQL ServerPWDCOMPARE() 返回 int 值 1 如果给定密码 mataces else 返回0

PWDCOMPARE

Hashes a password and compares the hash to the hash of an existing password. 

语法:

PWDCOMPARE ( 'clear_text_password', password_hash [ , version ] )

如果 clear_text_password 的哈希值与 password_hash 参数匹配,则返回 1,否则返回 0。

像这样更改您的查询,

SELECT Password 
FROM aspnet_Membership 
WHERE PWDCOMPARE('Password321!', Password) = 1;

或者你可以使用 PWDENCRYPT()

PWDENCRYPT:

    Returns the SQL Server password hash of the input value that uses the current 
version of the password hashing algorithm.

语法:

PWDENCRYPT ( 'password' )

像这样更改您的查询,

SELECT Password 
FROM aspnet_Membership 
WHERE Password = PWDENCRYPT('Password321!');

【讨论】:

  • 相关文档的链接(为了展示您如何知道答案是什么)将使这成为一个更好的答案。
  • 好的,我试过了:SELECT Password FROM aspnet_Membership WHERE PWDCOMPARE('Password321!', Password) = 1;输出什么都没有,但是如果你把 0 它带有数据接下来我尝试的是: SELECT Password,PWDCOMPARE('Password321!',Password) password_match FROM aspnet_Membership, aspnet_Users WHERE UserName = 'admin';密码匹配 = 0;我使用 Prakhar Asthana 的示例作为 sa 并返回 1。我所做的只是使用 aspnet_regsql.exe 使用 asp.net 的成员资格,然后使用 asp.net 工具箱中的 CreateUserWizard 并使用密码但不匹配。
【解决方案2】:

如果您使用 SQL Server 对用户进行身份验证,则应尝试利用最佳实践来最大程度地减少 Web 服务器中 SQL 注入的可能性。

下面的查询是使用 SHA1 身份验证在登录时对用户进行身份验证的一个很好的示例。 请注意,它不是一个 java 实现,但它应该能让您很好地了解您做错了什么。

sql = "SELECT user_id, user_name, user_level 
        FROM users
        WHERE user_name = '" . mysql_real_escape_string($_POST['user_name']) . "'
        AND user_pass = '" . sha1($_POST['user_pass']) . "'";

【讨论】:

  • 感谢您的回复,我刚刚从我的站点中删除了 MD5 哈希,现在使用 SHA-256,这对我来说会更好。正如我在互联网上看到的那样,SHA1 将在 2016 年或 2017 年停止使用。此外,我将尝试使用表单执行 sql 语句,以减少 MS SQL 上的 SQL 注入问题。
猜你喜欢
  • 2013-06-21
  • 2016-07-30
  • 2020-10-05
  • 2020-09-21
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 2020-08-09
相关资源
最近更新 更多