加密密码为显示中文

时间:2019-05-31 06:58:43

标签: sql sql-server

我想在存储过程中将密码从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

但是实际结果是:

  

诧鸺쇬⒍맣㮶뎨뗮兴サ

1 个答案:

答案 0 :(得分:1)

这是因为您应将应将HASHBYTES函数存储在startService(Intent)中的结果存储到NVARCHAR字段中。

这是一个显示以下内容的有效示例:

VARBINARY

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

如您所见,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