Як отримати суму MD5 рядка за допомогою python?


262

У документах API Flickr потрібно знайти суму рядка MD5 для створення [api_sig]значення.

Як можна сформувати суму MD5 з рядка?

Приклад Флікра:

рядок: 000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite

Сума MD5: a02506b31c1cd46c2e0b6380fb94eb3d

Відповіді:


252

Для Python 2.x використовуйте хешліб 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 символів, ви можете зробити фрагмент, як сказав Баріс Демірай.
ryan

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 для взаємодії з API Flickr:

... що стосуватиметься автентифікації для вас.

Офіційна документація хелібу


Я бачив API. Мені було просто цікаво, як я це все могла зробити. Дякую!
супер9

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 приймає байтінгрінг і не приймає unicode. Python 3 є (правильно) суворим / явним, і тому str ( "") є unicode і повинен бути закодований до тестування. Рядки в python2 можна інтерпретувати як рядок btyestring або unicode, а передача ""рядка str ( ) інтерпретується як бітестрінг. Якщо рядок містить символи unicode, це призведе до винятку. Кодування атестації залишить символів ascii недоторканими та правильно перетворить unicode
Чарльз Л.

11

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

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


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.