gpt4 book ai didi

sql - 加密密码显示中文

转载 作者:行者123 更新时间:2023-12-04 15:44:46 25 4
gpt4 key购买 nike

我想在一个存储过程中将密码从 NVARCHAR 更改为它的 MD5 哈希值,但是在执行它之后,密码哈希值显示为中文字符。为什么?

我正在使用此代码 EncryptByPassPhrase('MD5', @Password)但它仍然将结果显示为汉字

BEGIN

DECLARE @HashThis nvarchar(4000);
SELECT @HashThis = CONVERT(nvarchar(4000),@Password);


Insert Into tblUserLogin (ICNumber,Email,[Password],CreateBy,CreateDate,LastUpdateBy,LastUpdateDate)
Values (@ICNumber,@Email,HASHBYTES('SHA1',@HashThis),@FirstName,GETDATE(),@FirstName,GETDATE())

END

预期结果应该是这样的:

0x01000000E6A0E10AF0144E38670D9B8E92E6E22787F9CD27B467E253



但实际结果是:

詫鸺쇬⒍맣㮶뎨뗮兴サ

最佳答案

这是因为您正在存储调用 HASHBYTES 的结果。函数变成 NVARCHAR字段何时应该将其存储在 VARBINARY 中.

这是一个工作示例,显示了这一点:

CREATE TABLE UserHash
(
[Password_NVARCHAR] NVARCHAR(200),
[Password_VARBINARY] VARBINARY(20)
)

DECLARE @Password NVARCHAR(20) = 'Abcdefghijklmnop'
DECLARE @HashThis nvarchar(4000);
SELECT @HashThis = CONVERT(nvarchar(4000),@Password);

INSERT
INTO [UserHash]
(
Password_NVARCHAR,
Password_VARBINARY
)
SELECT HASHBYTES('SHA1',@HashThis),
HASHBYTES('SHA1',@HashThis)

SELECT *
FROM [UserHash]

这是该代码中最后一条语句的结果:
The results as shown in SQL Server Management Studio

如您所见, NVARCHAR version 显示了您不期望的内容,这是因为调用 HASHBYTES 的结果被解释为文本,而不是一系列字节。

如果看 Password_NVARCHAR中的文字长度字段(例如通过执行 SELECT LEN(Password_NVARCHAR) FROM [UserHash] )你会看到它返回为 10 .如 NVARCHAR 使用每个字符 2 个字节存储文本,您的 20 字节哈希将显示为 10 个字符的字符串。

注意 :在上面的脚本中,我调整了大小 Password_VARBINARY根据 HASHBYTES 的链接文档,拟合 SHA1 结果您应该根据所使用的散列算法调整列的大小:

The output conforms to the algorithm standard: 128 bits (16 bytes) for MD2, MD4, and MD5; 160 bits (20 bytes) for SHA and SHA1; 256 bits (32 bytes) for SHA2_256, and 512 bits (64 bytes) for SHA2_512



旁白 :不要将密码存储为散列,使用 Salted Hash .

关于sql - 加密密码显示中文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56390179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com