iT邦幫忙

0

MS SQL SHA512加密問題

小k 2019-12-10 14:42:551153 瀏覽
  • 分享至 

  • twitterImage

請問為什麼TYPE跟TYPE2加密後的結果會不一樣?
我想要TYPE2出來的結果跟TYPE一樣

DECLARE @Password  nvarchar(128),
		@TYPE  nvarchar(128),
		@TYPE2  nvarchar(128)	
SET @Password =	'123456'


SET @TYPE = (SELECT lower(CONVERT(varchar(max), HASHBYTES ('SHA2_512','123456') ,2)))
SET @TYPE2 = (SELECT lower(CONVERT(varchar(max), HASHBYTES ('SHA2_512',@Password) ,2)))

select @Password as 密碼, @TYPE as TYPE,@TYPE2 as TYPE2

https://ithelp.ithome.com.tw/upload/images/20191210/20104137gZivkKY7Xi.png

因為兩個型別不一樣,出來的結果也會不一樣。
就算同樣是字串型別,也會因為不同的宣告而不同的。

我記得未宣告型別直接指定的字串型別好像是char的樣子。不太清楚mssql的預設型別。
'123456' -> 預設為 varchar
N'123456' -> 預設為 nvarchar

改為這樣就好
SET @TYPE = (SELECT lower(CONVERT(varchar(max), HASHBYTES ('SHA2_512',N'123456') ,2)))
小k iT邦新手 4 級 ‧ 2019-12-13 13:20:09 檢舉
感謝解答
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
Zed_Yang
iT邦新手 3 級 ‧ 2019-12-10 14:53:20
最佳解答
DECLARE @Password  varchar(128),
		@TYPE  nvarchar(128),
		@TYPE2  nvarchar(128)
			
SET @Password =	'123456'


SET @TYPE = (SELECT lower(CONVERT(varchar(max), HASHBYTES ('SHA2_512','123456') ,2)))
SET @TYPE2 = (SELECT lower(CONVERT(varchar(max), HASHBYTES ('SHA2_512',@Password) ,2)))

select @Password as 密碼, @TYPE as TYPE,@TYPE2 as TYPE2

將@Password 型態改為 varchar即可
但詳細原因我也還不確定

Zed_Yang iT邦新手 3 級 ‧ 2019-12-10 14:57:39 檢舉

MSSQL預設為UTF8 因此型態為varchar 或 char
Nchar 或 Nvarchar 皆為unicode 每一個字元為兩個 bytes

所以表面上一樣 實際上因為所佔bytes不同
導致結果有所改變

小k iT邦新手 4 級 ‧ 2019-12-13 13:20:19 檢舉

感謝解答

我要發表回答

立即登入回答