先來描述下情況吧,首先有一批用戶之前批量錄入後預設的密碼為6個8然後進行MD5加密後進行存儲的,現在需要對其更改根據用戶身份證號後6位作為密碼。 1.首先發現我們sqlserver05以上的版本是自帶了MD5加密方法的,然後我們對其驗證其加密後的數據跟用.net自帶的MD5加密方法加密後是否相同。 ...
先來描述下情況吧,首先有一批用戶之前批量錄入後預設的密碼為6個8然後進行MD5加密後進行存儲的,現在需要對其更改根據用戶身份證號後6位作為密碼。
1.首先發現我們sqlserver05以上的版本是自帶了MD5加密方法的,然後我們對其驗證其加密後的數據跟用.net自帶的MD5加密方法加密後是否相同。
SQLserver中取MD5方法:select HASHBYTES('MD5','888888')
結果為發現是16進位的與我們所需要的是不太一樣的。
進行內置轉換並截取形成我們所需要的MD5加密後的數據結果為
然後我們到.net中進行測試加密數據查看加密後的是否符合
發現與我們在SQL中進行加密的值相同,說明兩者的加密方法一致的。
2.下來我們就到資料庫里去操作啦!
執行update操作後到系統里檢查後發現不對上不去。
又回到資料庫中進行檢查。(檢索下看是否一致,這邊由於用戶名便是身份證號(USERID)所以取表的userid再進行截取後6位再進行加密處理)
select top 10 substring(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',substring(UserID,LEN(UserID)-5,6))),3,32),substring(UserID,LEN(UserID)-5,6),UserID from db_owner.SystemUser where db_owner.SystemUser.RoleGuid=25
發現從資料庫里截取後再進行加密與我們手動輸入的值加密後的結果不同。
後來發現我們存儲USERID時候用的是nvarchar類型,此時實則個位元組占的位數是實際的兩倍。由於這個原因導致加密後的值不同。
後將其轉為varchar後進行測試
select top 10 substring(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',cast(substring(UserID,LEN(UserID)-5,6) as varchar(100)))),3,32),substring(UserID,LEN(UserID)-5,6),UserID from db_owner.SystemUser where db_owner.SystemUser.RoleGuid=25
發現與我們期望的結果相同了。