Python kullanarak bir dizenin MD5 toplamı nasıl alınır?


262

In Flickr API docs , oluşturmak bir dize MD5 toplamı bulmalıyız [api_sig]değeri.

Bir dizeden MD5 toplamı nasıl oluşturulur?

Flickr örneği:

dize: 000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite

MD5 toplamı: a02506b31c1cd46c2e0b6380fb94eb3d

Yanıtlar:


252

Python 2.x için python'un hashlib'ini kullanın

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

Çıktı: a02506b31c1cd46c2e0b6380fb94eb3d


77
Kullanmaya hashlib.md5().update('your string').hexdigest()çalışmayın update(), hiçbiri döndürmediğinden çalışmaz . Tek satırlık bir çözüm istiyorsanız, Mark Longair'in cevabını kullanın.
Christopher Manning

@ChristopherManning m.hexdigest () 32 karakter uzunluğunda bir özet döndürür. 16 karakter uzunluğunda bir özet nasıl elde edilir?
Adil Malik

@Darwesh 32 karakterdir, çünkü onaltılık temsil, m.digest_sizebu kodun üstünde bir tane yapın, iç özet zaten 16 bayttır.
Barış Demiray

1
@Darwesh sadece dizeyi dilimleyebilirsinizm.hexdigest()[:16]
fedterzi

@Darwesh RFC 1321'e göre , md5 her zaman 16 bayttır. Sadece 16 karakter uzunluğunda bir özet istiyorsanız, Barış Demiray'ın dediği gibi bir dilim yapabilirsiniz.
ryan

569

Aşağıdakileri yapabilirsiniz:

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

Ancak bu durumda, Flickr API'sı ile etkileşim kurmak için bu yararlı Python modülünü kullanmaktan daha iyidir:

... sizin için kimlik doğrulamasıyla ilgilenecek.

Hashlib'in resmi belgeleri


API'yı gördüm. Nasıl olsa nasıl yapabileceğimi merak ediyordum. Teşekkürler!
super9

1
hexdigest (), 32 karakter uzunluğunda bir özet döndürür. 16 karakter uzunluğunda bir özet nasıl elde edilir?
Adil Malik

2
Güzel cevap! Python 2'de neden utf-8 kodlaması yapmamız gerekmediğini sorabilir miyim, ancak Python 3'te kodlamayı yapmamız gerekiyor. Teşekkürler. @Mark Longair
Jeff Hu

3
@JeffHu, çünkü bayt benzeri bir nesnehashlib.md5 bekliyor
MaxU

1
Python 3 sürümü de Python 2'de kullanılmalıdır. @MeffU'nun söylediklerini genişleten @JeffHu, md5 işlevi bir bytestring alır ve unicode'u kabul etmez. Python 3 (doğru) katı / açıktır ve bu nedenle bir str ( "") unicode'dur ve bir test kodlamasına kodlanmalıdır. Python2 içindeki dizeler bir btyestring veya unicode dize olarak yorumlanabilir ve str ( "") dizesini geçirme bir bytestring olarak yorumlanır. Dizenin unicode karakterleri varsa, bu bir İstisna oluşturur. Bir kodlamanın kodlanması, ascii karakterlere dokunulmaz ve doğru unicode dönüştürür
Charles L.

11

Hashlib'de MD5 uygulamasını kullanmayı denediniz mi? Karma algoritmaların genellikle metin verileri yerine ikili veriler üzerinde etkili olduğunu unutmayın, bu nedenle karma işleminden önce metinden ikili verilere dönüştürmek için hangi karakter kodlamasının kullanıldığına dikkat etmek isteyebilirsiniz.

Sonuç karmasının bir de ikili veridir - Flickr örnek daha sonra altıgen kodlama kullanarak metne dönüştürülmüştür gibi görünüyor. hexdigestBunu elde etmek için hashlib'deki işlevi kullanın .


hexdigest (), 32 karakter uzunluğunda bir özet döndürür. 16 karakter uzunluğunda bir özet nasıl elde edilir?
Adil Malik

1
@Darwesh: Evet, MD5 128 bit, onaltılık 32 karakter. Daha küçük bir özet istiyorsanız, 64 bitlik bir özet gerekir. Yine de oldukça zayıf olacak ...
Jon Skeet

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


0

İle deneyebilirsiniz

#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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.