Jak uzyskać sumę MD5 ciągu za pomocą Pythona?


262

W dokumentach API Flickr musisz znaleźć sumę MD5 ciągu, aby wygenerować [api_sig]wartość.

Jak sobie radzić z generowaniem sumy MD5 z ciągu?

Przykład Flickr:

strunowy: 000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite

Suma MD5: a02506b31c1cd46c2e0b6380fb94eb3d

Odpowiedzi:


252

W przypadku Pythona 2.x użyj skrótu pythona

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

Wynik: a02506b31c1cd46c2e0b6380fb94eb3d


77
Nie próbuj używać hashlib.md5().update('your string').hexdigest(), nie będzie działać, ponieważ update()zwraca Brak. Jeśli chcesz rozwiązania jednoliniowego, użyj odpowiedzi Marka Longaira.
Christopher Manning

@ChristopherManning m.hexdigest () zwraca skrót o długości 32 znaków. Jak uzyskać podsumowanie o długości 16 znaków?
Adil Malik,

@Darwesh to 32 znaki, ponieważ jest to reprezentacja szesnastkowa, zrób m.digest_sizena wierzchu tego kodu, wewnętrzne podsumowanie ma już 16 bajtów.
Baris Demiray,

1
@Darwesh możesz po prostu pokroić sznurekm.hexdigest()[:16]
fedterzi

@Darwesh Zgodnie z RFC 1321 , md5 ma zawsze 16 bajtów. Jeśli chcesz po prostu podsumować 16 znaków, możesz zrobić plasterek, jak powiedział Baris Demiray.
ryan

569

Możesz wykonać następujące czynności:

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())

Jednak w tym przypadku prawdopodobnie lepiej jest użyć tego pomocnego modułu Python do interakcji z interfejsem API Flickr:

... które zajmą się uwierzytelnianiem za Ciebie.

Oficjalna dokumentacja hashlib


Widziałem API. Byłem po prostu ciekawy, jak to zrobić. Dzięki!
super9,

1
hexdigest () zwraca skrót o długości 32 znaków. Jak uzyskać podsumowanie o długości 16 znaków?
Adil Malik,

2
Niezła odpowiedź! Czy mogę zapytać, dlaczego w Pythonie 2 nie musimy kodować utf-8, jednak w Pythonie 3 musimy to zrobić. Dzięki. @Mark Longair
Jeff Hu

3
@JeffHu, ponieważ hashlib.md5oczekuje obiektu podobnego do bajtów
MaxU

1
Wersja Python 3 powinna być również używana w Python 2. @JeffHu rozwija to, co powiedział @MaxU, funkcja md5 wymaga testowania i nie akceptuje Unicode. Python 3 jest (poprawnie) ścisły / jawny, a zatem str ( "") jest Unicode i musi być zakodowany do bajtowania. Ciągi w python2 można interpretować jako ciąg bajtowy lub ciąg Unicode, a przekazanie ciągu str ( "") jest interpretowane jako bajtowanie. Jeśli ciąg ma znaki Unicode, spowoduje to wyjątek. Kodowanie bajtowania pozostawia nietknięte znaki ascii i poprawnie konwertuje Unicode
Charles L.

11

Próbowałeś użyć implementacji MD5 w hashlib ? Zauważ, że algorytmy mieszające zwykle działają na danych binarnych, a nie na danych tekstowych , więc możesz być ostrożny przy wybieraniu kodowania znaków przed konwersją z tekstu na dane binarne.

Wynik od mieszania jest również dane binarne - wygląda na przykład Flickr została następnie przekształcona tekstu przy użyciu kodowania hex. hexdigestAby to zrobić, użyj funkcji w hashlib.


hexdigest () zwraca skrót o długości 32 znaków. Jak uzyskać podsumowanie o długości 16 znaków?
Adil Malik,

1
@Darwesh: Cóż, tak, MD5 ma 128 bitów, czyli 32 znaki szesnastkowe. Jeśli chcesz mieć mniejszy skrót, potrzebujesz 64-bitowego skrótu. To będzie jednak dość słabe ...
Jon Skeet

3
Try This 
import hashlib
user = input("Enter text here ")
h = hashlib.md5(user.encode())
h2 = h.hexdigest()
print(h2)

3

Możesz użyć bznaku przed literałem ciągu :

import hashlib
print(hashlib.md5(b"Hello MD5").hexdigest())
print(hashlib.md5("Hello MD5".encode('utf-8')).hexdigest())

Na zewnątrz:

e5dadf6524624f79c3127e247f04b548
e5dadf6524624f79c3127e247f04b548

0

Możesz spróbować z

#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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.