2015-02-26 7 views
2

Я занимаюсь автоматизацией входа в веб-приложение. Префикс веб-приложения и суффикс с несколькими восьмеричными экранированными символами с паролем, сделайте md5-хэш пароля на стороне клиента и отправьте на сервер.Python Octal Escape String

Итак, когда I Md5 шифрует строку с использованием Java Script, я получаю результат ниже.

Webapp использует https://ideone.com/2C1b5 JS lib для преобразования MD5 на стороне клиента. hexMD5() принадлежит к этой библиотеке.

enter image description here

Но когда я пытаюсь сделать то же самое с помощью питона я получаю различный результат.

import hashlib 
def getMd5(string): 
    m = hashlib.md5() 
    m.update(string) 
    return m.hexdigest() 
prefix = "\051" 
suffix = "\341\303\026\153\155\271\161\166\030\054\324\011\046\035\344\274" 

prefix = unicode(prefix,'unicode-escape') 
suffix = unicode(suffix,'unicode-escape') 
salted = prefix+"HELLO"+suffix 
print getMd5(salted.encode('utf8')) 

Результат

c7862e873e9bc54a93aec58c199cda37 

Может ли один объяснить, что я делаю неправильно здесь?

+0

Вы пробовали смотреть на то, что 'myStr' содержит? –

+0

Если я его распечатаю, я получаю хлам, потому что большинство восьмеричных экранированных символов недоступны для печати. –

ответ

2
import hashlib 
def getMd5(string): 
    m = hashlib.md5() 
    m.update(string) 
    return m.hexdigest() 
prefix = "\051" 
suffix ="\341\303\026\153\155\271\161\166\030\054\324\011\046\035\344\274" 


salted = prefix+"HELLO"+suffix 
print getMd5(salted) 

37a0c199850b36090b439c3ac152fd70 

Не использовать юникод дает тот же результат, что и ваш Javascript.

Если я правильно понял ваш комментарий правильно:

len(r"\051" == 4 # use raw string r 
len("\051") == 1 
+0

Понял проблему. В приведенном выше сценарии len (prefix) равен 1, так как мы определяем таким образом. Но в случае, когда я разбираю HTML-страницу для извлечения префикса и суффикса. Так что len (prefix) в моем случае возвращает 4 (\, 0,5 & 1). Не могли бы вы дать понять, как с этим справиться? –

+0

Спасибо. Это то, чего я хотел. Но как я могу преобразовать «сырую строку» в неэкранированную нормальную строку (r "\ 051" -> "\ 051"). Я попробовал mystr.encode ('string-escape'), но он не работает. –

+0

декодирование ('string-escape') выполнено. Большое спасибо за вашу помощь. –