我正在尝试创建一个哈希密码输入的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'
;
答案 0 :(得分:3)
这不是问题的直接答案;这是关于问题方法的安全说明
在 MySQL中不哈希密码。提供给MySQL的数据是纯文本,并且在被转储到数据库之前很容易被MySQL处理日志以及可能的许多其他地方拦截(例如,如果发送到数据库的消息包是非localhost
并且是非TLS)。 (Why?)
在散列密码时,您希望尽可能早地执行此操作。这通常意味着使用PHP password_hash
并简单地仅在中转储散列数据。
如果您不使用PHP与SQL交互,那么您可以使用其他服务器方法,例如Argon2或Libsodium。
另外作为一个侧面点,您应该使用mb4
UTF-8字符集和排序规则 - 主要是utf8mb4_general_ci
(Why?)