【问题标题】:Why won't my SQL passwordhashing-procedure run?为什么 mySQL 密码哈希过程不运行?
【发布时间】:2018-04-11 20:01:33
【问题描述】:

我正在尝试创建一个散列密码输入的 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 哈希,因为它是一种快速哈希算法,并且互联网上有 GB 的现有彩虹表可以将 SHA512 哈希反转为密码在 SHA512 哈希中不使用盐的秒数...
  • 我明白,但我目前正在学习,所以我只需要在更改我的哈希方法之前让它工作。它仍然不起作用,我担心还有另一件事在出错
  • “我改变了我的哈希方法。它仍然不起作用,”是的,因为CREATE OR REPLACE PROCEDURE 也是 SQL-server 语法.. MySQL 不支持 REPLACE 子句.. MySQL 也不支持带有CREATE PROCEDURE 语句的OUTPUT 子句...N'sondre.example@gmail.com' 前面的N 也是SQL-server 语法。ERROR_MESSAGE() 也是SQL-server 函数...
  • 你不懂。您仍在使用 SQL Server 的特定功能和 MySQL,您仍在尝试使用数据库进行哈希处理。如果你不明白不能随意将 SQL server 函数与 MySQL 混合,那你怎么能理解任何事情呢?这个密码散列问题已经一次又一次地解决了——你甚至有谷歌、stackoverflow、一台带键盘的电脑。用它来找出其他人做了什么,你会发现很多解释和推理。你的方式 - 糟糕。
  • 哈哈,习惯了网上求助被人骂,没问题。我知道你们中的大多数人是好意的。我没有意识到我使用的多个命令与 MySQL 不兼容。此外,我遵循以下建议并在 PHP 中进行哈希处理以获得更好的安全性。谢谢你教我:)

标签: mysql sql


【解决方案1】:

这不是问题的直接答案;这是关于问题方法的安全说明

NOT 散列密码 MySQL。提供给 MySQL 的数据是明文的,在转储到数据库之前,很容易被 MySQL 处理日志以及可能的许多其他地方截获(例如,如果发送到数据库的消息包是非localhost 和非 TLS) . (Why?)

在对密码进行哈希处理时,您希望尽可能早地这样做。这通常意味着使用 PHP password_hash 并简单地转储 only MySQL 中的散列数据。

如果您不使用 PHP 与您的 SQL 交互,那么您可以使用其他服务器方法,例如 Argon2Libsodium


另外,您应该使用mb4 UTF-8 字符集和排序规则——原则上是utf8mb4_general_ciWhy?

【讨论】:

  • 我明白了。然后我将在 PHP 中散列。感谢您提供宝贵的信息。
  • "然后我将在 PHP 中散列。"如果您将在 PHP 中散列而不是从数据库中散列,那么这个问题就解决了吗?正确的? @Aune 那么你应该接受这个答案作为解决方案-> meta.stackexchange.com/questions/5234/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 2013-06-30
  • 2016-09-17
  • 2014-12-31
  • 2018-01-02
  • 2021-04-25
相关资源
最近更新 更多