存储过程的返回值

时间:2018-07-09 15:07:38

标签: sql sql-server tsql

我在SQL Server上implemented Bcrypt。一切正常。

我现在正在尝试创建一个过程,在该过程中,用户发送其用户名和密码(未哈希),无论是否允许他,该过程都会返回。

CREATE PROCEDURE CONNECTION
    @Login_name VARCHAR(15),
    @not_hashed_pass CHAR(15)
AS
BEGIN
    DECLARE @is_match BIT

    SET @is_match = (SELECT
                         dbo.CheckPassword(@not_hashed_pass, 
                                           (SELECT user_password FROM USERS 
                                            WHERE LOGIN_NAME= @Login_name)))

    IF @is_match = 1 
        PRINT 'connected'
    ELSE
        PRINT 'not connected'    
END

如果执行该过程,则会得到以下结果

  

未连接(@is_match = 0)

但是,如果我尝试执行设置为@is_match的查询,则:

SELECT
    dbo.CheckPassword('azeqsd456789', 
                      (SELECT user_password FROM USERS 
                       WHERE LOGIN_NAME = 'Bob))

我得到一个1的返回。

查询和过程均以相同的值执行。

1 个答案:

答案 0 :(得分:2)

除了使用散列密码外,您的问题是char()varchar()的混乱。您的过程声明为:

CREATE PROCEDURE CONNECTION (
    @Login_name varchar(15),
    @not_hashed_pass char(15)
)

您输入的密码有12个字符,因此将三个空格填充到''azeqsd456789 '中。因此,它们不匹配。

我建议修正过程定义:

CREATE PROCEDURE CONNECTION (
    @Login_name varchar(15),
    @not_hashed_pass varchar(15)
)

但更重要的是,我强烈建议您不要使用明文密码,并始终对它们进行哈希处理。