Я работаю над скриптом 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 по умолчанию?