Как получить сумму MD5 строки с помощью Python?


262

В документах Flickr API вам нужно найти сумму строки MD5 для генерации [api_sig]значения.

Как можно получить сумму MD5 из строки?

Пример Flickr:

строка: 000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite

Сумма MD5: a02506b31c1cd46c2e0b6380fb94eb3d

Ответы:


252

Для Python 2.x используйте hashlib для python

import hashlib
m = hashlib.md5()
m.update("000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite")
print m.hexdigest()

Вывод: a02506b31c1cd46c2e0b6380fb94eb3d


77
Не пытайтесь использовать hashlib.md5().update('your string').hexdigest(), это не будет работать, так как update()возвращает None. Если вы хотите однострочное решение, воспользуйтесь ответом Марка Лонгэйра.
Кристофер Мэннинг

@ChristopherManning m.hexdigest () возвращает дайджест длиной 32 символа. Как получить дайджест длиной в 16 символов?
Адиль Малик

@Darwesh это 32 символа, потому что это шестнадцатеричное представление, сделайте m.digest_sizeнад этим кодом, внутренний дайджест уже 16 байтов.
Барис Демирай

1
@Darwesh Вы можете просто нарезать строкуm.hexdigest()[:16]
fedterzi

@Darwesh Согласно RFC 1321 , md5 всегда составляет 16 байтов. Если вам просто нужен дайджест длиной 16 символов, вы можете сделать фрагмент, как сказал Барис Демирай.
Райан

569

Вы можете сделать следующее:

Python 2.x

import hashlib
print hashlib.md5("whatever your string is").hexdigest()

Python 3.x

import hashlib
print(hashlib.md5("whatever your string is".encode('utf-8')).hexdigest())

Однако в этом случае вам, вероятно, лучше использовать этот полезный модуль Python для взаимодействия с Flickr API:

... который будет иметь дело с аутентификацией для вас.

Официальная документация hashlib


Я видел API. Мне было просто любопытно, как я мог сделать это так или иначе. Спасибо!
super9

1
hexdigest () возвращает дайджест длиной 32 символа. Как получить дайджест длиной в 16 символов?
Адиль Малик

2
Хороший ответ! Могу я спросить, почему в Python 2 нам не нужно делать кодировку utf-8, однако в Python 3 нам нужно делать кодировку. Спасибо. @Mark Longair
Джефф Ху

3
@JeffHu, потому что hashlib.md5ожидает подобный
байту

1
Версия Python 3 должна использоваться и в Python 2. @JeffHu расширяя сказанное @MaxU, функция md5 принимает строку байтов и не принимает юникод. Python 3 является (правильно) строгим / явным, и поэтому a str ( "") является юникодом и должен быть закодирован в строку байтов. Строки в python2 могут интерпретироваться как строка btyestring или unicode, а передача ""строки str ( ) интерпретируется как строка байтов. Если строка содержит символы Юникода, это вызовет исключение. Кодирование строки байта оставит символы ascii нетронутыми и правильно конвертирует юникод
Чарльз Л.

11

Вы пытались использовать реализацию MD5 в hashlib ? Обратите внимание, что алгоритмы хеширования обычно действуют на двоичные данные, а не на текстовые данные, поэтому вы можете быть осторожны с тем, какая кодировка символов используется для преобразования текста в двоичные данные перед хешированием.

Результат хеша также двоичные данные - это выглядит как пример Flickr в затем был преобразован в текст , используя шестигранную кодировку. Используйте hexdigestфункцию в hashlib, чтобы получить это.


hexdigest () возвращает дайджест длиной 32 символа. Как получить дайджест длиной в 16 символов?
Адиль Малик

1
@Darwesh: Да, MD5 имеет 128 бит, что составляет 32 символа в шестнадцатеричном формате. Если вы хотите меньший дайджест, вам понадобится 64-битный дайджест. Это будет довольно слабым, хотя ...
Джон Скит



0

Вы можете попробовать с

#python3
import hashlib
rawdata = "put your data here"
sha = hashlib.sha256(str(rawdata).encode("utf-8")).hexdigest() #For Sha256 hash
print(sha)
mdpass = hashlib.md5(str(sha).encode("utf-8")).hexdigest() #For MD5 hash
print(mdpass)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.