Почему моя процедура хеширования паролей sql не запускается?

Я пытаюсь создать процедуру SQL, которая хеширует ввод пароля. Этот код не запускается, и я не получаю никаких полезных ошибок ответа.

Первая часть создает таблицу, вторая - процедуру. Когда я вызываю свою процедуру в третьей части, она отправляет значения в процедуру. Там пароль предполагается хешировать с помощью SHA2_512 и вставлять в таблицу, которую мы сделали еще раз.

Я использовал онлайн-исследования, чтобы сделать этот код, я не могу получить следующие части:

N перед моими ценностями

SetNoCount

Сообщение @responsemessage

-- makes Admin table
CREATE TABLE IF NOT EXISTS `AdminUser` (
  `AdminID` smallint(6) NOT NULL AUTO_INCREMENT,
  `Username` char(15) NOT NULL,
  `PasswordHash` BINARY(64) NOT NULL,
  `Fornavn` char(30) NOT NULL,
  `Etternavn` char(40) NOT NULL,
  `Email` char(40) NOT NULL,
  PRIMARY KEY (`AdminID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Makes hashing procedure
CREATE OR REPLACE PROCEDURE vm_ski.addAdmin
    @pUsername NVARCHAR(50), 
    @pPassword NVARCHAR(50),
    @pFornavn NVARCHAR(30), 
    @pEtternavn NVARCHAR(40),
    @pEmail NVARCHAR(40),
    @responseMessage NVARCHAR(250)='' OUTPUT    
AS
BEGIN
    SET NOCOUNT ON

    BEGIN TRY

        INSERT INTO vm_ski.AdminUser (Username, PasswordHash, Fornavn, Etternavn, Email)
        VALUES(@pUsername, HASHBYTES('SHA2_512', @pPassword), @pFornavn, @pEtternavn, @pEmail)

        SET @responseMessage='Success'

    END TRY
    BEGIN CATCH
        SET @responseMessage=ERROR_MESSAGE() 
    END CATCH

END;

-- Admin example
DECLARE @responseMessage NVARCHAR(250)

EXECUTE vm_ski.addAdmin
          @pUsername = N'sondre',
          @pPassword = N'example'
          @pFornavn = N'Sondre'
          @pEtternavn = N'Morgendal'
          @pEmail = N'sondre.example@gmail.com'
          ;

Потому что HASHBYTES('SHA2_512', @pPassword) не является функцией MySQL. в MySQL вам нужно использовать SHA2(@pPassword, 512) ... И вы не должны использовать хэш SHA512, потому что это быстрый алгоритм хеширования, и в Интернете есть ГБ существующих радужных таблиц, которые могут изменить хэш SHA512 на пароль в течение нескольких секунд без используя соль с в хэше SHA512 ...

Raymond Nijland 11.04.2018 13:38

Я понимаю, но в настоящее время учусь, поэтому мне просто нужно заставить его работать, прежде чем я изменю свой метод хеширования. Это по-прежнему не работает, я боюсь, что есть еще одна причина ошибки

Aune 11.04.2018 13:44

«Я меняю свой метод хеширования. Он по-прежнему не работает». Да, потому что CREATE OR REPLACE PROCEDURE также является синтаксисом SQL-сервера. MySQL не поддерживает там предложение REPLACE. MySQL также не поддерживает предложение OUTPUT с операторами CREATE PROCEDURE. .. N'sondre.example@gmail.com' Инфронт N также является синтаксисом SQL-сервера .. ERROR_MESSAGE() также является функцией SQL-сервера ...

Raymond Nijland 11.04.2018 14:09

Вы не понимаете. Вы все еще используете специальные функции SQL Server с MySQL, вы все еще пытаетесь хешировать с помощью базы данных. Если вы не понимаете, что нельзя случайным образом смешивать функции SQL-сервера с MySQL, то как вы можете что-то понять? Эта проблема с хешированием паролей решалась снова и снова, и у вас даже есть Google, stackoverflow, компьютер с клавиатурой. Используйте его, чтобы узнать, что делали другие люди, вы найдете множество объяснений и аргументов. По-твоему - плохо.

N.B. 11.04.2018 14:11

С уважением, @Aune, вы бы не научились ремонтировать двигатели в самолете. Изобретать собственную проверку пароля - это опасный в современном Интернете, сканирующем киберпреступники. Прочтите это, если не знаете, почему. HaveIbeenPwned.com. Прочтите это, чтобы узнать о передовых методах работы. php.net/manual/en/faq.passwords.php

O. Jones 11.04.2018 14:16

Вы, наверное, задаетесь вопросом, почему у вас так много зениток. Почему? Многие люди были обожжены тем, что вы делаете.

O. Jones 11.04.2018 14:21

Ха-ха, я привык, что людей критикуют, когда они просят помощи в Интернете, без проблем. Я знаю, что у большинства из вас хорошие намерения. Я не понимал, что несколько используемых мной команд несовместимы с MySQL. Кроме того, я последовал приведенному ниже совету и использовал PHP для большей безопасности. Спасибо что учите меня :)

Aune 11.04.2018 18:57
1
7
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

This is not a direct answer to the question; this is a security note on the methodology of the question

Сделайте НЕТ хеш-паролей в MySQL. Данные, передаваемые MySQL, представляют собой открытый текст и легко перехватываются журналами обработки MySQL, а также, возможно, множеством других мест, прежде чем они будут сброшены в базу данных (например, если пакеты сообщений, отправленные в базу данных, не относятся к localhost и не относятся к TLS). (Почему?)

При хешировании паролей вы хотите сделать это как можно раньше. Обычно это означает использование PHP password_hash и простой сброс Только хешированных данных в MySQL.

Если вы не используете PHP для взаимодействия с вашим SQL, вы можете использовать другие серверные методы, такие как Аргон2 или Либсодиум.


Также как побочный момент вы должны использовать кодировку и сопоставления mb4 UTF-8 - в основном utf8mb4_general_ci (Почему?)

Я понимаю. Тогда я буду использовать хеширование в PHP. Спасибо за ценную информацию.

Aune 11.04.2018 13:50

«Тогда я буду хешировать в PHP». если вы будете использовать хеширование в PHP вместо базы данных, тогда этот вопрос будет решен? верно? @Aune, тогда вы должны принять этот ответ как решение -> meta.stackexchange.com/questions/5234/…

Raymond Nijland 11.04.2018 14:12

Другие вопросы по теме