2009-09-21 30 views
1

我正在使用Python腳本從現有系統創建類似於ASP.NET的MembershipProvider的散列字符串。使用Python,有沒有辦法獲取一個十六進制字符串並將其轉換回二進制文件,然後執行base64編碼,以某種方式將原始字符串視爲Unicode。讓我們嘗試一些代碼。我期待重新編碼散列密碼,這樣的哈希值將是Python和ASP.NET/C#等於:Python可以編碼字符串以匹配ASP.NET成員資格提供程序的EncodePassword

import base64 
import sha 
import binascii 

def EncodePassword(password): 
    # strings are currently stored as hex 
    hex_hashed_password = sha.sha(password).hexdigest() 

    # attempt to convert hex to base64 
    bin_hashed_password = binascii.unhexlify(hex_hashed_password) 
    return base64.standard_b64encode(bin_hashed_password) 

print EncodePassword("password") 
# W6ph5Mm5Pz8GgiULbPgzG37mj9g= 

的ASP.NET的MembershipProvider用戶這個方法來進行編碼:

static string EncodePassword(string pass) 
{ 
    byte[] bytes = Encoding.Unicode.GetBytes(pass); 
    //bytes = Encoding.ASCII.GetBytes(pass); 

    byte[] inArray = null; 
    HashAlgorithm algorithm = HashAlgorithm.Create("SHA1"); 
    inArray = algorithm.ComputeHash(bytes); 
    return Convert.ToBase64String(inArray); 
} 

string s = EncodePassword("password"); 
// 6Pl/upEE0epQR5SObftn+s2fW3M= 

那不匹配。但是,當我使用以ASCII編碼編碼的密碼運行它時,它會匹配,所以.NET方法的Unicode部分有什麼不同。

W6ph5Mm5Pz8GgiULbPgzG37mj9g =

有沒有在python腳本的方式來獲得一個輸出相匹配的默認.NET版本?

回答

5

這是招:

Encoding.Unicode

「的Unicode」編碼爲混淆UTF-16LE微軟說話(特別是,沒有任何BOM)。對散列前的字符串進行編碼,你會得到正確的答案:

>>> import hashlib 
>>> p= u'password' 
>>> hashlib.sha1(p.encode('utf-16le')).digest().encode('base64') 
'6Pl/upEE0epQR5SObftn+s2fW3M=\n' 
+0

謝謝,這是很好的信息。我可能不夠清楚,但是這可以應用於已經哈希的密碼嗎?如果python中的原始密碼沒有以這種方式編碼,那麼我可能沒有辦法讓它退出來應用utf-16le編碼。那有意義嗎? – RyanW 2009-09-22 06:52:18

+0

事實上,一旦哈希,你永遠不會收回它。 – bobince 2009-09-22 12:40:47

相關問題