2010-03-17 72 views
2

我的問題是有點毛茸茸的,我可能會問錯了問題,所以請多多包涵......是否可以將40個字符的SHA1哈希轉換爲20個字符的SHA1哈希?

我有一個存儲用戶密碼&鹽爲會員制的傳統MySQL數據庫。這兩個值都被使用Ruby框架散列 - 大致是這樣的:

hashedsalt = 文摘:: SHA1.hexdigest(「 - #{Time.now.to_s} - #{登錄} - - 「)

hashedpassword = 文摘:: SHA1.hexdigest(」 #{hashedsalt}:#{密碼}「)

所以這兩個值被存儲爲40個字符的字符串(VARCHAR(40) )在MySQL中。

現在我需要將所有這些用戶導入到新成員網站的ASP.NET成員資格框架中,該網站使用SQL Server數據庫。我的理解是,我配置ASP.NET成員資格的方式,用戶密碼和salt也存儲在成員資格數據庫(在表aspnet_Membership中)作爲SHA1哈希值,然後進行Base64編碼(有關詳細信息,請參見here)並存儲作爲nvarchar(128)數據。

但是,從存儲的Base64編碼字符串的長度(28個字符)看來,ASP.NET成員資格生成的SHA1哈希長度只有20個字符,而不是40個。從其他閱讀中我一直在做我認爲這與每個字符/字符集/編碼或相關的位數有關。

那麼有什麼方法可以將40個字符的SHA1哈希值轉換爲20個字符的哈希值,然後我可以將其轉換爲新的ASP.NET成員資格數據表?我現在對ASP.NET成員非常熟悉,但我覺得我只是缺少這一塊。然而,也可能知道Ruby中的SHA1和.NET中的SHA1不兼容,所以我正在爲一場失敗的戰鬥而戰......

在此先感謝您的任何見解。

回答

2

Ruby應用程序中的varchar表示看起來像是'hex as string',如下所示:01AB02EF...23EF。也就是說,每個字節都表示爲從00到FF的一對字符,即字節的十六進制值。因此SHA哈希(20個字節)被表示爲40個字符。如果散列值是(0,1,2,...),則字符串將是000102. ASP base64是實際字節的base64編碼。所以你需要做的就是獲取MySQL字符並獲取相應的字節,然後將它們編碼爲base64。

實際上,你可以做轉型SQL本身:

declare @x varchar(40); 
set @x = '000102030405060708090A0B0C0D0E0F10111213'; 

declare @sql nvarchar(max); 
set @sql = N'set @out=0x' + @x; 

declare @out varbinary(20); 
exec sp_executesql @sql, N'@out varbinary(20) output', @out output; 
select @out for xml path(''); 

但強迫你的ASP.Net成員資格提供使用鹽漬哈希Ruby代碼中創建的,不相關的用於存儲哈希摘要的編碼,這是一個完全不同的話題。您可能必須重新編寫自己的會員供應商,此時存儲編碼變得無關緊要,因爲您可以隨意存儲它們。

+0

非常有趣,我將在明天嘗試這個。非常感謝。 – ewitch 2010-03-17 23:29:56

1

Ruby使用SHA2,而ASP.NET使用SHA1,否則不能在這些版本之間「轉換」。爲此,您需要重新計算純文本中的哈希值。

編輯:SHA已經標準化,因此您可以在Internet上搜索在ASP.NET中使用的SHA2庫。

+0

.net有一個SHA1類:http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha1.aspx – 2010-03-17 22:58:22