MS SQL哈希密码与纯文本进行比较

时间:2014-12-01 03:25:39

标签: java sql-server database encryption hash

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

PWDCOMPARE('Password321!', Password);

请帮助,

由于

中号

2 个答案:

答案 0 :(得分:2)

对于SQL Server,如果给定的密码mataces else返回PWDCOMPARE(),则1返回int值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!');

答案 1 :(得分:0)

如果您使用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']) . "'";