Làm thế nào để python tính toán hàm băm md5 của một chuỗi?

Mô-đun này triển khai một giao diện chung cho nhiều thuật toán phân loại thông báo và băm an toàn khác nhau. Bao gồm các thuật toán băm bảo mật FIPS SHA1, SHA224, SHA256, SHA384 và SHA512 [được định nghĩa trong FIPS 180-2] cũng như thuật toán MD5 của RSA [được định nghĩa trong internet RFC 1321]. Các thuật ngữ “băm an toàn” và “thông báo thông báo” có thể hoán đổi cho nhau. Các thuật toán cũ hơn được gọi là bản tóm tắt thông báo. Thuật ngữ hiện đại là băm an toàn

Ghi chú

Nếu bạn muốn các hàm băm adler32 hoặc crc32, chúng có sẵn trong mô-đun

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
1

Cảnh báo

Một số thuật toán đã biết điểm yếu xung đột băm, hãy tham khảo phần “Xem thêm” ở cuối

Thuật toán băm¶

Có một phương thức hàm tạo được đặt tên cho mỗi loại hàm băm. Tất cả trả về một đối tượng băm có cùng giao diện đơn giản. Ví dụ. sử dụng

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
2 để tạo đối tượng băm SHA-256. Bây giờ, bạn có thể cung cấp đối tượng này bằng đối tượng giống như byte [thường là
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
3] bằng cách sử dụng phương thức
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
4. Tại bất kỳ thời điểm nào, bạn có thể yêu cầu nó tóm tắt kết nối của dữ liệu được cung cấp cho nó cho đến nay bằng cách sử dụng các phương pháp
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
5 hoặc
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
6.

Ghi chú

Để có hiệu suất đa luồng tốt hơn, Python GIL được phát hành cho dữ liệu lớn hơn 2047 byte khi tạo đối tượng hoặc khi cập nhật.

Ghi chú

Việc nạp các đối tượng chuỗi vào

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
4 không được hỗ trợ, vì hàm băm hoạt động trên byte, không phải trên ký tự

Các hàm tạo cho thuật toán băm luôn có mặt trong mô-đun này là

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
8,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
9,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
2,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
01,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
02,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
03 và
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
04.
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
05 cũng thường có sẵn, mặc dù nó có thể bị thiếu hoặc bị chặn nếu bạn đang sử dụng bản dựng Python “tuân thủ FIPS” hiếm gặp. Các thuật toán bổ sung cũng có thể khả dụng tùy thuộc vào thư viện OpenSSL mà Python sử dụng trên nền tảng của bạn. Trên hầu hết các nền tảng,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
06,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
07,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
08,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
09,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
90,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
91 cũng có sẵn

Mới trong phiên bản 3. 6. Các hàm tạo SHA3 [Keccak] và SHAKE

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
06,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
07,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
08,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
09,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
90,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
91.

Mới trong phiên bản 3. 6. ______103 và

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
04 đã được thêm vào.

Đã thay đổi trong phiên bản 3. 9. Tất cả hàm tạo hashlib nhận một đối số chỉ từ khóa usedforsecurity với giá trị mặc định là

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
90. Giá trị sai cho phép sử dụng thuật toán băm không an toàn và bị chặn trong môi trường bị hạn chế.
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
91 chỉ ra rằng thuật toán băm không được sử dụng trong ngữ cảnh bảo mật, e. g. như một chức năng nén một chiều không mã hóa.

Hashlib hiện sử dụng SHA3 và SHAK từ OpenSSL 1. 1. 1 và mới hơn

Ví dụ: để có được bản tóm tắt của chuỗi byte

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
92

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
2

Cô đọng hơn

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
3

hashlib. mới[tên , [data, ]*, usedforsecurity=True]

Là một hàm tạo chung lấy tên chuỗi của thuật toán mong muốn làm tham số đầu tiên của nó. Nó cũng tồn tại để cho phép truy cập vào các hàm băm được liệt kê ở trên cũng như bất kỳ thuật toán nào khác mà thư viện OpenSSL của bạn có thể cung cấp. Các hàm tạo được đặt tên nhanh hơn nhiều so với

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
93 và nên được ưu tiên hơn

Sử dụng

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
93 với thuật toán do OpenSSL cung cấp

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'

Hashlib cung cấp các thuộc tính hằng số sau

hashlib. thuật toán được đảm bảo

Một bộ chứa tên của các thuật toán băm đảm bảo được mô-đun này hỗ trợ trên tất cả các nền tảng. Lưu ý rằng 'md5' có trong danh sách này mặc dù một số nhà cung cấp ngược dòng cung cấp bản dựng Python "tuân thủ FIPS" kỳ lạ loại trừ nó

Mới trong phiên bản 3. 2

hashlib. các thuật toán có sẵn

Một bộ chứa tên của các thuật toán băm có sẵn trong trình thông dịch Python đang chạy. Những tên này sẽ được công nhận khi được chuyển đến

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
93.
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
96 sẽ luôn là một tập hợp con. Cùng một thuật toán có thể xuất hiện nhiều lần trong bộ này dưới các tên khác nhau [nhờ OpenSSL]

Mới trong phiên bản 3. 2

Các giá trị sau được cung cấp dưới dạng thuộc tính hằng số của các đối tượng băm được hàm tạo trả về

băm. digest_size

Kích thước của hàm băm kết quả tính bằng byte

băm. block_size

Kích thước khối bên trong của thuật toán băm tính bằng byte

Một đối tượng băm có các thuộc tính sau

băm. tên

Tên chính tắc của hàm băm này, luôn viết thường và luôn phù hợp làm tham số cho

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
93 để tạo một hàm băm khác thuộc loại này

Đã thay đổi trong phiên bản 3. 4. Thuộc tính name đã có mặt trong CPython kể từ khi nó ra đời, nhưng mãi cho đến Python 3. 4 không được chỉ định chính thức, vì vậy có thể không tồn tại trên một số nền tảng.

Một đối tượng băm có các phương thức sau

băm. cập nhật[dữ liệu]

Cập nhật đối tượng băm bằng đối tượng giống như byte . Các cuộc gọi lặp lại tương đương với một cuộc gọi duy nhất với sự nối của tất cả các đối số.

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
98 tương đương với
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
99.

Đã thay đổi trong phiên bản 3. 1. GIL Python được phát hành để cho phép các luồng khác chạy trong khi cập nhật hàm băm trên dữ liệu lớn hơn 2047 byte đang diễn ra khi sử dụng thuật toán hàm băm do OpenSSL cung cấp.

băm. tiêu hóa[]

Trả lại bản tóm tắt của dữ liệu được truyền cho phương thức

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
4 cho đến nay. Đây là một đối tượng byte có kích thước
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
31 có thể chứa các byte trong toàn bộ phạm vi từ 0 đến 255

băm. hexdigest[]

Giống như

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
5 ngoại trừ thông báo được trả về dưới dạng đối tượng chuỗi có độ dài gấp đôi, chỉ chứa các chữ số thập lục phân. Điều này có thể được sử dụng để trao đổi giá trị một cách an toàn trong email hoặc các môi trường phi nhị phân khác

băm. bản sao[]

Trả về một bản sao [“bản sao”] của đối tượng băm. Điều này có thể được sử dụng để tính toán hiệu quả các bản tóm tắt dữ liệu chia sẻ một chuỗi con ban đầu chung

Bản tóm tắt chiều dài thay đổi của SHAKE¶

Các thuật toán

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
90 và
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
91 cung cấp các bản tóm tắt có độ dài thay đổi với độ dài_in_bit//2 lên đến 128 hoặc 256 bit bảo mật. Như vậy, phương pháp tiêu hóa của họ yêu cầu độ dài. Độ dài tối đa không bị giới hạn bởi thuật toán LẮC

lắc. tiêu hóa[độ dài]

Trả lại bản tóm tắt của dữ liệu được truyền cho phương thức

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
4 cho đến nay. Đây là một đối tượng byte có kích thước chiều dài có thể chứa các byte trong toàn bộ phạm vi từ 0 đến 255

lắc. hexdigest[độ dài]

Giống như

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
5 ngoại trừ thông báo được trả về dưới dạng đối tượng chuỗi có độ dài gấp đôi, chỉ chứa các chữ số thập lục phân. Điều này có thể được sử dụng để trao đổi giá trị một cách an toàn trong email hoặc các môi trường phi nhị phân khác

Băm tập tin¶

Mô-đun hashlib cung cấp chức năng trợ giúp để băm tệp hoặc đối tượng giống như tệp hiệu quả

hashlib. file_digest[fileobj , digest, /]

Trả về một đối tượng tiêu hóa đã được cập nhật với nội dung của đối tượng tệp

fileobj phải là một đối tượng giống như tệp được mở để đọc ở chế độ nhị phân. Nó chấp nhận các đối tượng tệp từ các phiên bản

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
37,
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
38 dựng sẵn, các đối tượng SocketIO từ
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
39 và các đối tượng tương tự. Hàm này có thể bỏ qua I/O của Python và sử dụng trực tiếp bộ mô tả tệp từ
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
20. fileobj phải được coi là ở trạng thái không xác định sau khi hàm này trả về hoặc tăng. Việc đóng fileobj là tùy thuộc vào người gọi

digest phải là tên thuật toán băm dưới dạng str, hàm tạo băm hoặc có thể gọi trả về đối tượng băm

Thí dụ

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
0

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
9

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
9

Mới trong phiên bản 3. 11

Dẫn xuất khóa¶

Thuật toán dẫn xuất khóa và kéo dài khóa được thiết kế để băm mật khẩu an toàn. Các thuật toán ngây thơ như

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
21 không chống lại các cuộc tấn công vũ phu. Một chức năng băm mật khẩu tốt phải có thể điều chỉnh được, chậm và bao gồm một muối

hashlib. pbkdf2_hmac[hash_name , mật khẩu, salt, iterations, dklen=None]

Hàm này cung cấp hàm dẫn xuất khóa dựa trên mật khẩu PKCS#5 2. Nó sử dụng HMAC làm chức năng giả ngẫu nhiên

Chuỗi hash_name là tên mong muốn của thuật toán phân loại băm cho HMAC, e. g. 'sha1' hoặc 'sha256'. mật khẩu và muối được hiểu là bộ đệm của byte. Các ứng dụng và thư viện nên giới hạn mật khẩu ở độ dài hợp lý [e. g. 1024]. muối phải có khoảng 16 byte trở lên từ một nguồn thích hợp, e. g.

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
22

Số lần lặp nên được chọn dựa trên thuật toán băm và sức mạnh tính toán. Kể từ năm 2022, hàng trăm nghìn lần lặp lại SHA-256 được đề xuất. Để biết lý do tại sao và cách chọn những gì tốt nhất cho ứng dụng của bạn, hãy đọc Phụ lục A. 2. 2 của NIST-SP-800-132. Các câu trả lời về câu hỏi lặp lại stackexchange pbkdf2 giải thích chi tiết

dklen là độ dài của khóa dẫn xuất. Nếu dklen là

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
23 thì kích thước thông báo của thuật toán băm hash_name được sử dụng, e. g. 64 cho SHA-512

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
3

Mới trong phiên bản 3. 4

Ghi chú

Triển khai nhanh pbkdf2_hmac có sẵn với OpenSSL. Việc triển khai Python sử dụng phiên bản nội tuyến của

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
24. Nó chậm hơn khoảng ba lần và không giải phóng GIL

Không dùng nữa kể từ phiên bản 3. 10. Triển khai Python chậm của pbkdf2_hmac không được dùng nữa. Trong tương lai, chức năng này sẽ chỉ khả dụng khi Python được biên dịch bằng OpenSSL.

hashlib. mã hóa[mật khẩu , *, salt, n, r, p, maxmem=0, dklen=64]

Chức năng này cung cấp chức năng dẫn xuất khóa dựa trên mật khẩu scrypt như được định nghĩa trong RFC 7914

mật khẩu và muối phải là đối tượng giống byte . Các ứng dụng và thư viện nên giới hạn mật khẩu ở độ dài hợp lý [e. g. 1024]. muối phải có khoảng 16 byte trở lên từ một nguồn thích hợp, e. g.

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
22.

n là hệ số chi phí CPU/Bộ nhớ, r kích thước khối, hệ số song song hóa p và bộ nhớ giới hạn maxmem [OpenSSL 1. 1. 0 mặc định là 32 MiB]. dklen là độ dài của khóa dẫn xuất

Mới trong phiên bản 3. 6

ĐEN2¶

BLAKE2 là một hàm băm mật mã được xác định trong RFC 7693 có hai loại

  • BLAKE2b, được tối ưu hóa cho nền tảng 64 bit và tạo ra các bản tóm tắt có kích thước bất kỳ từ 1 đến 64 byte,

  • BLAKE2s, được tối ưu hóa cho nền tảng 8 đến 32 bit và tạo ra các bản tóm tắt có kích thước bất kỳ từ 1 đến 32 byte

BLAKE2 hỗ trợ chế độ khóa [thay thế nhanh hơn và đơn giản hơn cho HMAC], băm muối, cá nhân hóa và băm cây

Các đối tượng băm từ mô-đun này tuân theo API của các đối tượng

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
0 của thư viện chuẩn

Tạo đối tượng băm¶

Các đối tượng băm mới được tạo bằng cách gọi hàm tạo

hashlib. blake2b[dữ liệu=b . , *, digest_size=64, key=b'', salt=b'', person=b'', fanout=1, depth=1, leaf_size=0, node_offset=0, node_depth=0, inner_size=0, last_node=False, usedforsecurity=True]hashlib.blake2s[dữ liệu=b, *, digest_size=32, key=b'', salt=b'', person=b'', fanout=1, depth=1, leaf_size=0, node_offset=0, node_depth=0, inner_size=0, last_node=False, usedforsecurity=True]

Các hàm này trả về các đối tượng băm tương ứng để tính BLAKE2b hoặc BLAKE2s. Họ tùy ý lấy các thông số chung này

  • dữ liệu. khối dữ liệu ban đầu để băm, phải là đối tượng dạng byte . Nó chỉ có thể được thông qua dưới dạng đối số vị trí.

  • tiêu hóa_size. kích thước của thông báo đầu ra tính bằng byte

  • Chìa khóa. khóa để băm có khóa [tối đa 64 byte cho BLAKE2b, tối đa 32 byte cho BLAKE2s]

  • Muối. muối để băm ngẫu nhiên [tối đa 16 byte cho BLAKE2b, tối đa 8 byte cho BLAKE2s]

  • người. chuỗi cá nhân hóa [tối đa 16 byte cho BLAKE2b, tối đa 8 byte cho BLAKE2s]

Bảng sau đây hiển thị giới hạn cho các tham số chung [tính bằng byte]

Băm

tiêu hóa_size

len[phím]

len[muối]

len[người]

BLACK2b

64

64

16

16

BLAKE2s

32

32

8

8

Ghi chú

Thông số kỹ thuật BLAKE2 xác định độ dài không đổi cho các tham số muối và cá nhân hóa, tuy nhiên, để thuận tiện, việc triển khai này chấp nhận các chuỗi byte có kích thước bất kỳ cho đến độ dài đã chỉ định. Nếu độ dài của tham số nhỏ hơn chỉ định, nó sẽ được đệm bằng số 0, do đó, ví dụ:

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
27 và
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
28 có cùng giá trị. [Đây không phải là trường hợp của khóa. ]

Các kích thước này có sẵn dưới dạng hằng số mô-đun được mô tả bên dưới

Các hàm xây dựng cũng chấp nhận các tham số băm cây sau

  • quạt ra. phân tán [0 đến 255, 0 nếu không giới hạn, 1 ở chế độ tuần tự]

  • chiều sâu. độ sâu tối đa của cây [1 đến 255, 255 nếu không giới hạn, 1 ở chế độ tuần tự]

  • kích thước lá. độ dài byte tối đa của lá [0 đến

    >>> h = hashlib.new['sha256']
    >>> h.update[b"Nobody inspects the spammish repetition"]
    >>> h.hexdigest[]
    '031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
    
    29, 0 nếu không giới hạn hoặc ở chế độ tuần tự]

  • nút_offset. độ lệch nút [0 đến

    >>> h = hashlib.new['sha256']
    >>> h.update[b"Nobody inspects the spammish repetition"]
    >>> h.hexdigest[]
    '031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
    
    60 cho BLAKE2b, 0 đến
    >>> h = hashlib.new['sha256']
    >>> h.update[b"Nobody inspects the spammish repetition"]
    >>> h.hexdigest[]
    '031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
    
    61 cho BLAKE2s, 0 cho đầu tiên, ngoài cùng bên trái, lá hoặc ở chế độ tuần tự]

  • nút_độ sâu. độ sâu nút [0 đến 255, 0 cho lá hoặc ở chế độ tuần tự]

  • kích thước bên trong. kích thước thông báo bên trong [0 đến 64 cho BLAKE2b, 0 đến 32 cho BLAKE2s, 0 ở chế độ tuần tự]

  • last_node. boolean cho biết liệu nút được xử lý có phải là nút cuối cùng hay không [

    >>> h = hashlib.new['sha256']
    >>> h.update[b"Nobody inspects the spammish repetition"]
    >>> h.hexdigest[]
    '031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
    
    91 cho chế độ tuần tự]

Xem phần 2. 10 trong đặc tả BLAKE2 để xem xét toàn diện về băm cây

Hằng số¶

blake2b. SALT_SIZEblake2s. SALT_SIZE

Chiều dài muối [chiều dài tối đa được các nhà xây dựng chấp nhận]

blake2b. PERSON_SIZEblake2s. PERSON_SIZE

Độ dài chuỗi cá nhân hóa [độ dài tối đa được các nhà xây dựng chấp nhận]

blake2b. MAX_KEY_SIZEblake2s. MAX_KEY_SIZE

Kích thước khóa tối đa

blake2b. MAX_DIGEST_SIZEblake2s. MAX_DIGEST_SIZE

Kích thước thông báo tối đa mà hàm băm có thể xuất ra

Ví dụ¶

Băm đơn giản¶

Để tính toán hàm băm của một số dữ liệu, trước tiên bạn nên xây dựng một đối tượng hàm băm bằng cách gọi hàm tạo thích hợp [

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
03 hoặc
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
04], sau đó cập nhật nó với dữ liệu bằng cách gọi
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
4 trên đối tượng và cuối cùng, lấy thông báo ra khỏi đối tượng

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
2

Là một lối tắt, bạn có thể chuyển đoạn dữ liệu đầu tiên để cập nhật trực tiếp vào hàm tạo dưới dạng đối số vị trí

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
6

Bạn có thể gọi

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
68 bao nhiêu lần tùy ý để cập nhật hàm băm lặp đi lặp lại

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
7

Sử dụng các kích cỡ tiêu hóa khác nhau¶

BLAKE2 có kích thước thông báo có thể định cấu hình lên tới 64 byte cho BLAKE2b và tối đa 32 byte cho BLAKE2s. Ví dụ: để thay thế SHA-1 bằng BLAKE2b mà không thay đổi kích thước của đầu ra, chúng ta có thể yêu cầu BLAKE2b tạo ra các bản tóm tắt 20 byte

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
30

Các đối tượng băm có kích thước thông báo khác nhau có đầu ra hoàn toàn khác nhau [các giá trị băm ngắn hơn không phải là tiền tố của các giá trị băm dài hơn];

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
31

Băm có khóa¶

Băm có khóa có thể được sử dụng để xác thực dưới dạng thay thế nhanh hơn và đơn giản hơn cho mã xác thực thông báo dựa trên Hash [HMAC]. BLAKE2 có thể được sử dụng một cách an toàn trong chế độ tiền tố-MAC nhờ thuộc tính khả năng phân biệt được kế thừa từ BLAKE

Ví dụ này cho thấy cách lấy mã xác thực 128-bit [mã hóa hex] cho tin nhắn

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
69 bằng khóa
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
70

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
32

Như một ví dụ thực tế, một ứng dụng web có thể ký đối xứng các cookie được gửi tới người dùng và sau đó xác minh chúng để đảm bảo rằng chúng không bị giả mạo

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
33

Mặc dù có chế độ băm có khóa gốc, nhưng tất nhiên, BLAKE2 có thể được sử dụng trong xây dựng HMAC với mô-đun

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
24

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
34

Băm ngẫu nhiên¶

Bằng cách đặt tham số muối, người dùng có thể giới thiệu ngẫu nhiên cho hàm băm. Băm ngẫu nhiên rất hữu ích để bảo vệ chống lại các cuộc tấn công va chạm vào hàm băm được sử dụng trong chữ ký số

Băm ngẫu nhiên được thiết kế cho các tình huống trong đó một bên, người chuẩn bị tin nhắn, tạo ra tất cả hoặc một phần của tin nhắn được ký bởi bên thứ hai, người ký tin nhắn. Nếu trình chuẩn bị thông báo có thể tìm thấy các xung đột hàm băm mật mã [i. e. , hai thông báo tạo ra cùng một giá trị băm], thì chúng có thể chuẩn bị các phiên bản có ý nghĩa của thông báo sẽ tạo ra cùng một giá trị băm và chữ ký số, nhưng với các kết quả khác nhau [e. g. , chuyển $1.000.000 vào tài khoản, thay vì $10]. Các hàm băm mật mã đã được thiết kế với mục tiêu chính là chống va chạm, nhưng việc tập trung tấn công các hàm băm mật mã hiện tại có thể dẫn đến một hàm băm mật mã nhất định cung cấp ít khả năng chống va chạm hơn dự kiến. Băm ngẫu nhiên cung cấp cho người ký sự bảo vệ bổ sung bằng cách giảm khả năng người chuẩn bị có thể tạo hai hoặc nhiều thông báo mà cuối cùng mang lại giá trị băm giống nhau trong quá trình tạo chữ ký số — ngay cả khi việc tìm ra xung đột cho hàm băm là thực tế. Tuy nhiên, việc sử dụng hàm băm ngẫu nhiên có thể làm giảm mức độ bảo mật do chữ ký điện tử cung cấp khi tất cả các phần của thông báo được người ký chuẩn bị

[NIST SP-800-106 “Randomized Hashing for Digital Signatures”]

Trong BLAKE2, muối được xử lý dưới dạng đầu vào một lần cho hàm băm trong quá trình khởi tạo, chứ không phải là đầu vào cho từng hàm nén

Cảnh báo

Băm muối [hoặc chỉ băm] với BLAKE2 hoặc bất kỳ hàm băm mật mã có mục đích chung nào khác, chẳng hạn như SHA-256, không phù hợp để băm mật khẩu. Xem Câu hỏi thường gặp về BLAKE2 để biết thêm thông tin

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
35

Cá nhân hóa¶

Đôi khi, rất hữu ích khi buộc hàm băm tạo ra các thông báo khác nhau cho cùng một đầu vào cho các mục đích khác nhau. Trích dẫn các tác giả của hàm băm Skein

Chúng tôi khuyên tất cả các nhà thiết kế ứng dụng nên nghiêm túc xem xét việc này; . Cá nhân hóa từng hàm băm được sử dụng trong giao thức sẽ ngăn chặn hoàn toàn kiểu tấn công này

[Họ hàm băm Skein, p. 21]

BLAKE2 có thể được cá nhân hóa bằng cách chuyển byte cho đối số người

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
36

Cá nhân hóa cùng với chế độ khóa cũng có thể được sử dụng để lấy các khóa khác nhau từ một khóa duy nhất

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
37

Chế độ cây¶

Đây là một ví dụ về băm một cây tối thiểu với hai nút lá

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
38

Ví dụ này sử dụng thông báo nội bộ 64 byte và trả về thông báo cuối cùng 32 byte

>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
39

Tín dụng¶

BLAKE2 được thiết kế bởi Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn và Christian Winnerlein dựa trên BLAKE lọt vào chung kết SHA-3 được tạo bởi Jean-Philippe Aumasson, Luca Henzen, Willi Meier và Raphael C. -W. Phan

Nó sử dụng thuật toán cốt lõi từ mật mã ChaCha được thiết kế bởi Daniel J. Bernstein

Việc triển khai stdlib dựa trên mô-đun pyblake2. Nó được viết bởi Dmitry Chestnykh dựa trên triển khai C được viết bởi Samuel Neves. Tài liệu được sao chép từ pyblake2 và được viết bởi Dmitry Chestnykh

Mã C được viết lại một phần cho Python bởi Christian Heimes

Sự cống hiến miền công cộng sau áp dụng cho cả triển khai hàm băm C, mã mở rộng và tài liệu này

Trong phạm vi có thể theo luật, [các] tác giả đã dành tất cả bản quyền và các quyền liên quan và lân cận đối với phần mềm này cho miền công cộng trên toàn thế giới. Phần mềm này được phân phối mà không có bất kỳ bảo hành nào

Bạn sẽ nhận được một bản sao của CC0 Public Domain Dedication cùng với phần mềm này. Nếu không, hãy xem https. //Commons sáng tạo. tổ chức/miền công cộng/không/1. 0/

Những người sau đây đã giúp phát triển hoặc đóng góp các thay đổi của họ cho dự án và miền công cộng theo Cống hiến miền công cộng của Creative Commons 1. 0 Phổ thông

  • Alexandr Sokolovskiy

Xem thêm

Mô-đun
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
24

Một mô-đun để tạo mã xác thực tin nhắn bằng cách sử dụng hàm băm

Mô-đun
>>> h = hashlib.new['sha256']
>>> h.update[b"Nobody inspects the spammish repetition"]
>>> h.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
73

Một cách khác để mã hóa băm nhị phân cho môi trường không nhị phân

https. //blake2. mạng lưới

Trang web BLAKE2 chính thức

https. //csrc. đầu tiên. gov/csrc/media/publications/fips/180/2/archive/2002-08-01/documents/fips180-2. pdf

Ấn phẩm FIPS 180-2 về thuật toán băm an toàn

https. // vi. wikipedia. org/wiki/Cryptographic_hash_function#Cryptographic_hash_algorithms

Bài viết trên Wikipedia có thông tin về thuật toán nào có vấn đề đã biết và điều đó có ý nghĩa gì đối với việc sử dụng chúng

Python tính toán MD5 như thế nào?

Làm cách nào để tạo tệp MD5 bằng Python? .
md5_hash = hashlib. md5[]
a_file = open["kiểm tra. txt", "rb"]
nội dung = a_file. đọc[]
md5_hash. cập nhật [nội dung]
thông báo = md5_hash. hexdigest[]
in [tiêu hóa]

Hàm băm MD5 được tính như thế nào?

Giải pháp. .
Mở dòng lệnh Windows. Nhấn Windows + R, gõ cmd và nhấn Enter. .
Chuyển đến thư mục chứa tệp có tổng kiểm tra MD5 mà bạn muốn kiểm tra và xác minh. Yêu cầu. Nhập cd theo sau là đường dẫn đến thư mục. .
Type the command below. certutil -hashfile MD5. .. .
nhấn Enter

Chủ Đề