我想在存储过程中将密码从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
但是实际结果是:
诧鸺쇬⒍맣㮶뎨뗮兴サ
答案 0 :(得分:1)
这是因为您应将应将HASHBYTES
函数存储在startService(Intent)
中的结果存储到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]
版本显示了您不期望的内容,这是因为调用NVARCHAR
的结果被解释为文本,而不是一系列字节。
如果您查看HASHBYTES
字段中文本的长度(例如通过执行Password_NVARCHAR
),则会看到此文本的返回值为 10 。由于NVARCHAR
每个字符使用2个字节存储文本,因此您的20个字节的哈希显示为10个字符串。
注意:在上面的脚本中,我调整了SELECT LEN(Password_NVARCHAR) FROM [UserHash]
的大小以适合SHA1结果,根据Password_VARBINARY
的链接文档,您应该根据正在使用的哈希算法:
输出符合算法标准:MD2,MD4和MD5为128位(16字节); SHA和SHA1为160位(20字节); SHA2_256为256位(32字节),SHA2_512为512位(64字节)
ASIDE :不要将密码存储为哈希,请使用Salted Hash。