先來描述下情況吧,首先有一批用戶之前批量錄入后默認的密碼為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
發現與我們期望的結果相同了。