2011-11-05 45 views
1

密碼需要與最初在.NET平臺上創建並存儲在MSSQL上的密碼哈希值進行匹配(因此加密可能是SHA1)。如何複製提供的密碼和salt的密碼哈希值(PHP/MySQL)

這裏是MySQL表的樣子:

CREATE TABLE IF NOT EXISTS `test` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `UserName` varchar(100) COLLATE latin1_general_ci DEFAULT NULL, 
    `PasswordHash` varchar(100) CHARACTER SET utf8 DEFAULT NULL, 
    `PasswordSalt` int(10) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=12535 ; 

-- 
-- Dumping data for table `test` 
-- 

INSERT INTO `test` (`id`, `UserName`, `PasswordHash`, `PasswordSalt`) VALUES(9836, 'demoadmin', '?z1??9t|????e&??9aK', -1190254076); 
INSERT INTO `test` (`id`, `UserName`, `PasswordHash`, `PasswordSalt`) VALUES(12534, 'sunny', '??o\\(R?8~??6>?t????o', 549612932); 

我發現兩個到我需要做的事情非常接近的例子,但我還是能夠使它發揮作用。

例1:http://gilbert.pellegrom.me/replicating-net-password-hashing-in-php/

例2:http://www.kevinbruce.com/Blog?area_id=6&blog_id=3&ba_id=27

用戶名和密碼是:

首先用戶:demoadmin/demotest 其次用戶:晴天/ eclyptix

請幫幫忙!

回答

0

它看起來就像你有一個編碼的問題:

'?z1??9t|????e&??9aK' 

看來你的原代碼被打破,並轉換角色了可打印的ASCII範圍內的成問號。

可能嘗試在PHP中複製此行爲。然而,繼續使用這個破碎的方案會危及你的系統的安全性,因爲它更有可能發現散列衝突。可能需要讓所有用戶更改密碼。這次確保哈希正確存儲。您也可以考慮將它們存儲爲十六進制字符串而不是二進制數據,以最大限度地減少進一步編碼問題的風險。

+0

感謝您的回答馬克,我同意你的意見。但是,如果可能的話,我需要儘可能地完成這項工作,因爲我們有一個擁有大量用戶的遺留數據庫。 這是他們最初存儲在SQL Server 2008數據庫(我會說他們存儲在一個二進制格式),我們需要將它們複製到MySQL數據庫,並使其與PHP的工作。從這一點上,我們可以將它們編碼爲HEX字符串並改進。 – crazyhorse

+0

@crazyhorse:如果幸運的話,數據已經正確存儲在SQL Server中,而您剛剛導出/導入不正確。 –

+0

不幸的是,它在SQL Server生產服務器上的情況也完全相同。 – crazyhorse

0

凱文布魯斯在這裏(從你引用的第二個例子)。

對於它的價值,我從來沒有用我的經驗解決問題。我實際上與伊麗莎白史密斯(Elizabeth Smith)(她爲Windows的PHP核心開發人員)交談過,她同意由於PHP中的字符編碼支持,在與.NET相同級別的哈希支持方面存在很大的脫節。這是我懷疑的。