为什么此 Salt CAST 在 SQL 服务器中为 NVARCHAR(32)?
Why is this Salt CAST as NVARCHAR(32) in SQL Server?
我了解了如何使用 HASHING 和 Salt 在 SQL 服务器数据库中存储密码。这段代码是在线的,没有真正有用的评论部分,所以我想在这里问一下。
为什么@salt
在这里被转换为NVARCHAR(36)
?
我尝试了不同的长度,比如 NVARCHAR(50)
,在数据库中,Salt
仍然保存为长度为 36 的字符串。
例如:
B25243D7-A126-48A8-90F2-5898572F54D2
E29E1CEF-DBE1-4373-9510-A911BA0C8672
CREATE TABLE dbo.[User1]
(
UserID INT IDENTITY(1,1) NOT NULL,
LoginName NVARCHAR(40) NOT NULL,
PasswordHash BINARY(64) NOT NULL,
Salt UNIQUEIDENTIFIER,
FirstName NVARCHAR(40) NULL,
LastName NVARCHAR(40) NULL,
CONSTRAINT [PK1_User_UserID] PRIMARY KEY CLUSTERED (UserID ASC)
)
CREATE PROCEDURE dbo.uspAddUser1
@pLogin NVARCHAR(50),
@pPassword NVARCHAR(50),
@pFirstName NVARCHAR(40) = NULL,
@pLastName NVARCHAR(40) = NULL,
@responseMessage NVARCHAR(250) OUTPUT
AS
BEGIN
SET NOCOUNT ON
DECLARE @salt UNIQUEIDENTIFIER=NEWID()
BEGIN TRY
INSERT INTO dbo.[User1] (LoginName, PasswordHash, Salt, FirstName, LastName)
VALUES(@pLogin, HASHBYTES('SHA2_512', @pPassword+CAST(@salt AS NVARCHAR(36))), @salt, @pFirstName, @pLastName)
SET @responseMessage = 'Success'
END TRY
BEGIN CATCH
SET @responseMessage = ERROR_MESSAGE()
END CATCH
END
DECLARE @responseMessage NVARCHAR(250)
EXEC [dbo].[uspAddUser1]
@pLogin = 'admin2',
@pPassword = '123456',
@pFirstName = 'John',
@pLastName = 'Smith',
@responseMessage = @responseMessage OUTPUT
SELECT * FROM [dbo].[User1]
是因为DECLARE @salt UNIQUEIDENTIFIER=NEWID()
。在 sql 服务器 NEWID()
函数中 returns 字符长度为 36
的 UNIQUEIDENTIFIER
我了解了如何使用 HASHING 和 Salt 在 SQL 服务器数据库中存储密码。这段代码是在线的,没有真正有用的评论部分,所以我想在这里问一下。
为什么@salt
在这里被转换为NVARCHAR(36)
?
我尝试了不同的长度,比如 NVARCHAR(50)
,在数据库中,Salt
仍然保存为长度为 36 的字符串。
例如:
B25243D7-A126-48A8-90F2-5898572F54D2
E29E1CEF-DBE1-4373-9510-A911BA0C8672
CREATE TABLE dbo.[User1]
(
UserID INT IDENTITY(1,1) NOT NULL,
LoginName NVARCHAR(40) NOT NULL,
PasswordHash BINARY(64) NOT NULL,
Salt UNIQUEIDENTIFIER,
FirstName NVARCHAR(40) NULL,
LastName NVARCHAR(40) NULL,
CONSTRAINT [PK1_User_UserID] PRIMARY KEY CLUSTERED (UserID ASC)
)
CREATE PROCEDURE dbo.uspAddUser1
@pLogin NVARCHAR(50),
@pPassword NVARCHAR(50),
@pFirstName NVARCHAR(40) = NULL,
@pLastName NVARCHAR(40) = NULL,
@responseMessage NVARCHAR(250) OUTPUT
AS
BEGIN
SET NOCOUNT ON
DECLARE @salt UNIQUEIDENTIFIER=NEWID()
BEGIN TRY
INSERT INTO dbo.[User1] (LoginName, PasswordHash, Salt, FirstName, LastName)
VALUES(@pLogin, HASHBYTES('SHA2_512', @pPassword+CAST(@salt AS NVARCHAR(36))), @salt, @pFirstName, @pLastName)
SET @responseMessage = 'Success'
END TRY
BEGIN CATCH
SET @responseMessage = ERROR_MESSAGE()
END CATCH
END
DECLARE @responseMessage NVARCHAR(250)
EXEC [dbo].[uspAddUser1]
@pLogin = 'admin2',
@pPassword = '123456',
@pFirstName = 'John',
@pLastName = 'Smith',
@responseMessage = @responseMessage OUTPUT
SELECT * FROM [dbo].[User1]
是因为DECLARE @salt UNIQUEIDENTIFIER=NEWID()
。在 sql 服务器 NEWID()
函数中 returns 字符长度为 36
UNIQUEIDENTIFIER