Làm cách nào để lấy tổng MD5 của chuỗi bằng python?


262

Trong tài liệu API Flickr , bạn cần tìm tổng MD5 của chuỗi để tạo [api_sig]giá trị.

Làm thế nào để một người đi về việc tạo ra một tổng MD5 từ một chuỗi?

Ví dụ của Flickr:

chuỗi: 000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite

Tổng MD5: a02506b31c1cd46c2e0b6380fb94eb3d

Câu trả lời:


252

Đối với Python 2.x, hãy sử dụng hashlib của python

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

Đầu ra: a02506b31c1cd46c2e0b6380fb94eb3d


77
Đừng cố sử dụng hashlib.md5().update('your string').hexdigest(), nó sẽ không hoạt động kể từ khi update()trả về Không có. Nếu bạn muốn giải pháp một dòng, hãy sử dụng câu trả lời của Mark Longair.
Christopher Manning

@ChristopherManning m.hexdigest () trả về bản tóm tắt dài 32 ký tự. Làm thế nào để có được một tiêu hóa dài 16 ký tự?
Adil Malik

@Darwesh có 32 ký tự vì đó là biểu diễn hex, thực hiện m.digest_sizetrên đầu mã này, thông báo nội bộ đã là 16 byte.
Baris Demiray

1
@Darwesh bạn chỉ cần cắt chuỗim.hexdigest()[:16]
fedterzi

@Darwesh Theo RFC 1321 , md5 luôn là 16 byte. Nếu bạn chỉ muốn một bản tóm tắt dài 16 ký tự, bạn có thể thực hiện một lát như Baris Demiray nói.
ryan

569

Bạn có thể làm như sau:

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

Tuy nhiên, trong trường hợp này, có lẽ bạn nên sử dụng mô-đun Python hữu ích này để tương tác với API Flickr:

... sẽ đối phó với xác thực cho bạn.

Tài liệu chính thức của hashlib


Tôi đã thấy API. Tôi chỉ tò mò làm thế nào tôi có thể làm điều đó bằng mọi cách. Cảm ơn!
super9

1
hexdigest () trả về một bản tóm tắt dài 32 ký tự. Làm thế nào để có được một tiêu hóa dài 16 ký tự?
Adil Malik

2
Câu trả lời tốt đẹp! Tôi có thể hỏi tại sao trong Python 2 chúng ta không cần thực hiện mã hóa utf-8, tuy nhiên trong Python 3 chúng ta cần thực hiện mã hóa. Cảm ơn. @Mark Longair
Jeff Hu

3
@JeffHu, vì hashlib.md5mong đợi một đối tượng giống byte
MaxU

1
Phiên bản Python 3 cũng nên được sử dụng trong Python 2. @JeffHu mở rộng dựa trên những gì @MaxU đã nói, hàm md5 có một giá trị phụ và không chấp nhận unicode. Python 3 là (chính xác) nghiêm ngặt / rõ ràng và do đó, một str ( "") là unicode và phải được mã hóa thành một bytestring. Các chuỗi trong python2 có thể được hiểu là một chuỗi btyestring hoặc unicode và việc truyền ""chuỗi str ( ) được hiểu là một chuỗi phụ. Nếu chuỗi có các ký tự unicode, điều này sẽ đưa ra một Ngoại lệ. Mã hóa một bytestring sẽ khiến các ký tự ascii không bị ảnh hưởng và chuyển đổi unicode chính xác
Charles L.

11

Bạn đã thử sử dụng triển khai MD5 trong hashlib chưa? Lưu ý rằng thuật toán băm thường hoạt động trên dữ liệu nhị phân thay vì dữ liệu văn bản , vì vậy bạn có thể muốn cẩn thận về việc mã hóa ký tự nào được sử dụng để chuyển đổi từ văn bản sang dữ liệu nhị phân trước khi băm.

Các kết quả của một băm cũng là dữ liệu nhị phân - nó trông giống như ví dụ Flickr đã sau đó được chuyển đổi thành văn bản sử dụng mã hóa hex. Sử dụng hexdigesthàm trong hashlib để có được điều này.


hexdigest () trả về một bản tóm tắt dài 32 ký tự. Làm thế nào để có được một tiêu hóa dài 16 ký tự?
Adil Malik

1
@Darwesh: Vâng, MD5 là 128 bit, có 32 ký tự trong hex. Nếu bạn muốn thông báo nhỏ hơn, bạn sẽ cần thông báo 64 bit. Điều đó sẽ khá yếu mặc dù ...
Jon Skeet

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


0

Bạn có thể thử với

#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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.