我在嘗試使用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網站登錄時的工作原理)?我嘗試換掉散列函數,顛倒密碼/鹽串聯,並在打電腦時大聲喊叫,而這些似乎都沒有幫助。
你能告訴在C#代碼中的散列函數?我假設你自己將它轉換爲PHP? – silkfire
它應該使用默認的ASP.NET成員資格散列函數。代碼是:http://stackoverflow.com/questions/1137368/what-is-default-hash-algorithm-that-asp-net-membership-uses。我使用了逐字發現的代碼,並得到了不同的結果,所以我想知道這裏沒有別的東西在玩嗎? –
Wohooo!我解決了它的人!得到正確的散列:'TQN7m8OWIyBOKVwzegWSUBVq7o7 + KWFBc46J + B77mLw =' – silkfire