Я не могу проверить, равен ли мой хешированный параметр @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
.