Используйте хешированный пароль для проверки пользователя с помощью хранимой процедуры - PullRequest
0 голосов
/ 01 ноября 2019

Я не могу проверить, равен ли мой хешированный параметр @password сохраненному хешированному паролю в моей базе данных с помощью хранимой процедуры (кажется, что ввод запроса вручную работает, но только при определенных непредвиденных условиях).

Я использую сервер Windows и управляю им с помощью Microsoft SQL Server Management Studio.

Хранимая процедура, которую я хочу создать, должна проверить, соответствуют ли псевдо-пароль и пароль, заданные в качестве аргументов, тем, которые хранятся вбаза данных. Возвращая 1, если истина, и 0, если ложь.

Я вставляю псевдо-пароль и пароль пользователя в таблицу с помощью хранимой процедуры, и я хеширую пароль с помощью функции HASHBYTES('SHA2_512', @password), где передается @passwordв качестве аргумента.

Я извлекаю данные с помощью другой хранимой процедуры, которая использует оператор IF EXISTS(), проверяющий

IF HASHBYTES('SHA2_512', @password) = person.password 
   AND @pseudo = person.pseudo
--Stored procedure

[dbo].[VerifyUser]
    (@pseudo NVARCHAR(16),
     @password NVARCHAR(64))
AS
BEGIN
    IF EXISTS(SELECT id FROM [PonderoStat].[dbo].[people] 
              WHERE LOWER(pseudo) = LOWER(@pseudo) 
                AND HASHBYTES('SHA2_512', @password) = people.password)
    BEGIN
        SELECT 1;
    END
    ELSE
    BEGIN
        SELECT 0;
    END
END

-- Handmade query
IF EXISTS(SELECT id FROM [PonderoStat].[dbo].[people] 
          WHERE people.password = HASHBYTES('SHA2_512', '1234') 
            AND LOWER(people.pseudo) = LOWER('1234'))
BEGIN
    SELECT 1;
END
ELSE
BEGIN
    SELECT 0;
END

-- Insert stored procedure
PROCEDURE [dbo].[AddUser]
     (@pseudo NVARCHAR(16), 
      @email NVARCHAR(64), 
      @password NVARCHAR(64), 
      @birthdate DATETIME2(7), 
      @height INT,
      @male BIT = NULL)
AS
BEGIN
    IF NOT EXISTS (SELECT 'True' FROM people WHERE LOWER(pseudo) = LOWER(@pseudo))
    BEGIN
        INSERT INTO people(pseudo, email, [password], birthdate, height,male)
        VALUES (@pseudo, @email, HASHBYTES('SHA2_512',@password), @birthdate, @height, @male)

        IF @@ROWCOUNT <= 0
            SELECT 0 AS id;
        ELSE
            SELECT TOP 1 id FROM people ORDER BY id DESC; 
    END
    ELSE
        SELECT id FROM people WHERE LOWER(pseudo) = LOWER(@pseudo);
END

Я вставил сегодня пользователя с целью тестирования сpseudo = '1234' и password = '1234'.

Я попытался использовать правильную информацию в качестве аргументов.

Хранимая процедура возвращает только 0 (не нашел пользователя с этим паролем, нодолжен был найти вхождение и вернуть 1), мой запрос ручной работы возвращает 1. (ожидаемый результат)

Я опробовал его с неверной информацией. В этом случае хранимая процедура возвращает 0 (ожидаемый результат), а мой ручной запрос также возвращает 0 (ожидаемый результат)

Я пытался использовать более старые записи в таблице (pseudo = 'Ngan' password = 'zen') и результат совпадает при вводе любых значений. Правильно или нет.

  • Хранимая процедура возвращает 0.
  • Ручной запрос возвращает 0.

Хранимая процедура работает, если я только пытаюсь проверить @pseudo = pseudo (стирая часть AND [...])

Но это не сработает, если я попытаюсь проверить только HASHBYTES('SHA2_512', @password) = password.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...