Может ли Python кодировать строку в соответствии с EncodePassword провайдера членства ASP.NET - PullRequest
1 голос
/ 22 сентября 2009

Я работаю над скриптом Python для создания хэшированных строк из существующей системы, аналогичной ASP.NET MembershipProvider. Используя Python, есть ли способ взять шестнадцатеричную строку и преобразовать ее обратно в двоичный файл, а затем выполнить кодирование base64, как-то трактуя исходную строку как Unicode. Давайте попробуем немного кода. Я пытаюсь перекодировать хешированный пароль, чтобы хэши были равны в Python и ASP.NET/C#:

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 по умолчанию?

1 Ответ

5 голосов
/ 22 сентября 2009

Это хитрость:

Encoding.Unicode

Кодировка «Юникод» сбивает с толку Microsoft-говорят для UTF-16LE (в частности, без спецификации). Зашифруйте строку перед хэшированием, и вы получите правильный ответ:

>>> import hashlib
>>> p= u'password'
>>> hashlib.sha1(p.encode('utf-16le')).digest().encode('base64')
'6Pl/upEE0epQR5SObftn+s2fW3M=\n'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...