2013-06-21 61 views
3

我在嘗試使用PHP對現有ASP.NET成員資格數據庫進行身份驗證時遇到了一些問題。我搜索了網頁,我發現的現有答案似乎不適合我。即:使用PHP驗證ASP.NET成員身份的用戶

public static function Hash($password, $salt) 
{ 
    $decodedSalt = base64_decode($salt); 
    $utf = mb_convert_encoding($password, 'UTF-16LE', 'UTF-8'); 
    return base64_encode(sha1($decodedSalt.$utf, true)); 
} 

我認爲這個問題的那部分是,密碼哈希值實際上不被計算與SHA-1中,由於在數據庫中的值是44個字符長,base64編碼字符串(這意味着輸入可能是256位長)。我試過使用SHA-256代替SHA-1,但無濟於事。我無法在web.config中找到一個機器密鑰,它可以進一步醃製哈希值,並且當我在本地或在生產服務器上運行時,ASP.NET站點會生成相同的哈希值,所以我不知道爲什麼他們沒有不匹配。

Web.config中成員提供:

<add connectionStringName="MySqlMembershipConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" autogenerateschema="true" name="MySqlMembershipProvider" type="MySql.Web.Security.MySQLMembershipProvider, mysql.web" /> 

實例密碼應該工作:

$salt = 'Mu1tp8XzfKl8dSTVAZm44A=='; // Straight from the DB 
$password = 'testing'; 
$expectedHash = 'TQN7m8OWIyBOKVwzegWSUBVq7o7+KWFBc46J+B77mLw=' // Straight from the DB 

// When using the above Hash function with SHA-256 instead of SHA-1 
$generatedHash = 'rpmTmtBfWoJz71ooQGQUIIyQJKd99qhYxMUI1yda0qE=' 

的思考?任何想法爲什麼我的散列不匹配存儲在數據庫中的內容(以及爲什麼/如何通過ASP.NET網站登錄時的工作原理)?我嘗試換掉散列函數,顛倒密碼/鹽串聯,並在打電腦時大聲喊叫,而這些似乎都沒有幫助。

+0

你能告訴在C#代碼中的散列函數?我假設你自己將它轉換爲PHP? – silkfire

+0

它應該使用默認的ASP.NET成員資格散列函數。代碼是:http://stackoverflow.com/questions/1137368/what-is-default-hash-algorithm-that-asp-net-membership-uses。我使用了逐字發現的代碼,並得到了不同的結果,所以我想知道這裏沒有別的東西在玩嗎? –

+1

Wohooo!我解決了它的人!得到正確的散列:'TQN7m8OWIyBOKVwzegWSUBVq7o7 + KWFBc46J + B77mLw =' – silkfire

回答

4

我看了一下您鏈接到的身份驗證問題頁面,其中一個特定的答案引起了我的注意:https://stackoverflow.com/a/4227642/633098

因爲您說過使用的算法不再是SHA1,而更可能是SHA256,所以我開始嘗試使用HMAC hash,SHA256來代替。它一開始沒有工作,但後來我嘗試使用由密碼和salt組成的串聯字符串以及salt(= key)本身,並且它工作正常。

這是我做了簡單的功能:

function _hash($password, $salt) { 
    return base64_encode(hash_hmac('sha256', base64_decode($salt) . iconv('UTF-8', 'UTF-16LE', $password), base64_decode($salt), true)); 
} 

$salt = 'Mu1tp8XzfKl8dSTVAZm44A=='; // Straight from the DB 
$password = 'testing'; 

var_dump(_hash($password, $salt)); 

結果散列:TQN7m8OWIyBOKVwzegWSUBVq7o7 + KWFBc46J + B77mLw =

+1

你搖滾!不知道我在另一篇文章中忽視了這一點,並且我從網絡上的其他來源獲得了很多有關.NET 4中新哈希函數的虛假信息。 –

+0

是的,關鍵是使用HMAC和鍵(salt),而不是常規的散列函數。祝你好運! – silkfire