2011-09-15 47 views
0

我有幾個問題將ASP站點的用戶帳戶遷移到Drupal。將密碼驗證從ASP遷移到PHP

的ASP網站會創建一個HashEncode密碼哈希(密碼+鹽)

我試圖找出哪些是在PHP中的等價功能,所以我可以把我們的Drupal密碼模塊相匹配。

有人在http://forums.overclockers.com.au/showthread.php?t=632736&page=2做了一個體面的嘗試,但它不起作用。

我聽說HashEncode是sha1,但我不認爲是這種情況。在另一個網站上,它顯示了兩個不輸出相同,我已確認我的本地PHP部分。

HashEncode("ABCD") = A11D4F0A70B882D58494B188DA0430CF4F17CFA8 

sha1('ABCD') = fb2f85c88567f3c8ce9b799c7c54642d0c7b41f6 

有誰知道ASP HashEncode是如何工作的,我怎麼能重現它在PHP,這樣我可以在整個用戶遷移?

在此先感謝!

回答

-1

正如您已經在論壇中提到的那樣,嘗試找到HashEncode函數的源代碼,以查看那裏發生了什麼。 也許ASP使用SHA2,它可以有多個密鑰長度(例如SHA256/SHA512)。

可以刪除所有的密碼,所以用戶需要重新創建他們的新軟件。這樣,所有密碼都將使用PHP的函數生成。

例使用SHA256 +鹽:

/** 
* generate salted password 
* @param string $plainTextPassword 
* @param string $salt default = NULL (create new salt) 
* @param int $saltLength default = 9 
* @return string password-hash 
*/ 
function passwordHash($plainTextPassword, $salt = null, $saltLength = 9) 
{ 
    if(is_null($salt)) 
    { 
     // create new salt 
     $salt = substr(sha1(uniqid(mt_rand(), true)), 0, $saltLength); 
    } 
    else 
    { 
     $salt = substr($salt, 0, $saltLength); 
    } 
    return $salt . hash('sha256', $salt . $plainTextPassword); 
} 
+0

我在Mac上開發,沒有ASP,所以我不能輕易查看源代碼。歡呼聲 – Nick

+0

我從來沒有使用過ASP,嘗試搜索引擎... – feeela

0

它通常是一個HMACSHA1哈希值,但關鍵是要確保它的UTF-16編碼。下面是一個JavaScript實現。

function str2rstr_utf16le(input) { 
    var output = [], 
     i = 0, 
     l = input.length; 

    for (; l > i; ++i) { 
    output[i] = String.fromCharCode(
     input.charCodeAt(i)  & 0xFF, 
     (input.charCodeAt(i) >>> 8) & 0xFF 
    ); 
    } 

    return output.join(''); 
} 

//utf 16 encoding is important 
var pwd = str2rstr_utf16le("test"); 
var hash = CryptoJS.HmacSHA1(pwd, pwd); 

var encodedPassword = CryptoJS.enc.Base64.stringify(hash); 
alert(encodedPassword);