Triển khai hàm băm Python

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

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 khởi tạo được đặt tên cho từng 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ể nạp đối tượng này bằng [thông thường] 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 đượ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 các 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,
>>> import io, hashlib, hmac
>>> with open[hashlib.__file__, "rb"] as f:
..     digest = hashlib.file_digest[f, "sha256"]
...
>>> digest.hexdigest[]  
'...'
1,
>>> import io, hashlib, hmac
>>> with open[hashlib.__file__, "rb"] as f:
..     digest = hashlib.file_digest[f, "sha256"]
...
>>> digest.hexdigest[]  
'...'
2, và.
>>> import io, hashlib, hmac
>>> with open[hashlib.__file__, "rb"] as f:
..     digest = hashlib.file_digest[f, "sha256"]
...
>>> digest.hexdigest[]  
'...'
5 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,
>>> import io, hashlib, hmac
>>> with open[hashlib.__file__, "rb"] as f:
..     digest = hashlib.file_digest[f, "sha256"]
...
>>> digest.hexdigest[]  
'...'
6,
>>> import io, hashlib, hmac
>>> with open[hashlib.__file__, "rb"] as f:
..     digest = hashlib.file_digest[f, "sha256"]
...
>>> digest.hexdigest[]  
'...'
7,
>>> import io, hashlib, hmac
>>> with open[hashlib.__file__, "rb"] as f:
..     digest = hashlib.file_digest[f, "sha256"]
...
>>> digest.hexdigest[]  
'...'
8,
>>> import io, hashlib, hmac
>>> with open[hashlib.__file__, "rb"] as f:
..     digest = hashlib.file_digest[f, "sha256"]
...
>>> digest.hexdigest[]  
'...'
9,
>>> buf = io.BytesIO[b"somedata"]
>>> mac1 = hmac.HMAC[b"key", digestmod=hashlib.sha512]
>>> digest = hashlib.file_digest[buf, lambda: mac1]
0,
>>> buf = io.BytesIO[b"somedata"]
>>> mac1 = hmac.HMAC[b"key", digestmod=hashlib.sha512]
>>> digest = hashlib.file_digest[buf, lambda: mac1]
1 cũng có sẵn

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

>>> import io, hashlib, hmac
>>> with open[hashlib.__file__, "rb"] as f:
..     digest = hashlib.file_digest[f, "sha256"]
...
>>> digest.hexdigest[]  
'...'
6,
>>> import io, hashlib, hmac
>>> with open[hashlib.__file__, "rb"] as f:
..     digest = hashlib.file_digest[f, "sha256"]
...
>>> digest.hexdigest[]  
'...'
7,
>>> import io, hashlib, hmac
>>> with open[hashlib.__file__, "rb"] as f:
..     digest = hashlib.file_digest[f, "sha256"]
...
>>> digest.hexdigest[]  
'...'
8,
>>> import io, hashlib, hmac
>>> with open[hashlib.__file__, "rb"] as f:
..     digest = hashlib.file_digest[f, "sha256"]
...
>>> digest.hexdigest[]  
'...'
9,
>>> buf = io.BytesIO[b"somedata"]
>>> mac1 = hmac.HMAC[b"key", digestmod=hashlib.sha512]
>>> digest = hashlib.file_digest[buf, lambda: mac1]
0,
>>> buf = io.BytesIO[b"somedata"]
>>> mac1 = hmac.HMAC[b"key", digestmod=hashlib.sha512]
>>> digest = hashlib.file_digest[buf, lambda: mac1]
1.

Mới trong phiên bản 3. 6. và đã được thêm vào.

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

>>> digest is mac1
True
>>> mac2 = hmac.HMAC[b"key", b"somedata", digestmod=hashlib.sha512]
>>> mac1.digest[] == mac2.digest[]
True
0. 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ế.
>>> digest is mac1
True
>>> mac2 = hmac.HMAC[b"key", b"somedata", digestmod=hashlib.sha512]
>>> mac1.digest[] == mac2.digest[]
True
1 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

>>> digest is mac1
True
>>> mac2 = hmac.HMAC[b"key", b"somedata", digestmod=hashlib.sha512]
>>> mac1.digest[] == mac2.digest[]
True
2

>>> import hashlib
>>> m = hashlib.sha256[]
>>> m.update[b"Nobody inspects"]
>>> m.update[b" the spammish repetition"]
>>> m.digest[]
b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'
>>> m.hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'

Cô đọng hơn

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

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 và nên được ưu tiên hơn

Sử dụng 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 chuyển đến. sẽ luôn là tậ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ố để 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 với. 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ố.

>>> digest is mac1
True
>>> mac2 = hmac.HMAC[b"key", b"somedata", digestmod=hashlib.sha512]
>>> mac1.digest[] == mac2.digest[]
True
8 tương đương với
>>> digest is mac1
True
>>> mac2 = hmac.HMAC[b"key", b"somedata", digestmod=hashlib.sha512]
>>> mac1.digest[] == mac2.digest[]
True
9

Đã 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 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 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 cho đến nay. Đây là một đối tượng byte có kích thước có thể chứa các byte trong toàn bộ phạm vi từ 0 đến 255

băm. hexdigest[]

Giống như 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

Thông báo chiều dài thay đổi của SHAKE

Các thuật toán

>>> buf = io.BytesIO[b"somedata"]
>>> mac1 = hmac.HMAC[b"key", digestmod=hashlib.sha512]
>>> digest = hashlib.file_digest[buf, lambda: mac1]
0 và
>>> buf = io.BytesIO[b"somedata"]
>>> mac1 = hmac.HMAC[b"key", digestmod=hashlib.sha512]
>>> digest = hashlib.file_digest[buf, lambda: mac1]
1 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ư 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 đối tượng dựng sẵn, các thể hiện, các đối tượng SocketIO từ và các đối tượng tương tự. Hàm có thể bỏ qua I/O của Python và sử dụng bộ mô tả tệp trực tiếp từ. 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ụ

________số 8_______

>>> buf = io.BytesIO[b"somedata"]
>>> mac1 = hmac.HMAC[b"key", digestmod=hashlib.sha512]
>>> digest = hashlib.file_digest[buf, lambda: mac1]

>>> digest is mac1
True
>>> mac2 = hmac.HMAC[b"key", b"somedata", digestmod=hashlib.sha512]
>>> mac1.digest[] == mac2.digest[]
True

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ư

>>> from hashlib import blake2b
>>> h = blake2b[]
>>> h.update[b'Hello world']
>>> h.hexdigest[]
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
1 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.

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à

>>> from hashlib import blake2b
>>> h = blake2b[]
>>> h.update[b'Hello world']
>>> h.hexdigest[]
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
3 thì kích thước tiêu hóa của thuật toán băm hash_name được sử dụng, e. g. 64 cho SHA-512

>>> from hashlib import pbkdf2_hmac
>>> our_app_iters = 500_000  # Application specific, read above.
>>> dk = pbkdf2_hmac['sha256', b'password', b'bad salt'*2, our_app_iters]
>>> dk.hex[]
'15530bba69924174860db778f2c6f8104d3aaf9d26241840c8c4a641c8d000a9'

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. 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à. 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.

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

BLACK2

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 trong 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. đoạn dữ liệu ban đầu để băm, phải là. 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 các số 0, do đó, ví dụ:

>>> from hashlib import blake2b
>>> h = blake2b[]
>>> h.update[b'Hello world']
>>> h.hexdigest[]
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
7 và
>>> from hashlib import blake2b
>>> h = blake2b[]
>>> h.update[b'Hello world']
>>> h.hexdigest[]
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
8 là cùng một 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 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

    >>> from hashlib import blake2b
    >>> h = blake2b[]
    >>> h.update[b'Hello world']
    >>> h.hexdigest[]
    '6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
    
    9, 0 nếu không giới hạn hoặc ở chế độ tuần tự]

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

    >>> from hashlib import blake2b
    >>> blake2b[b'Hello world'].hexdigest[]
    '6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
    
    0 cho BLAKE2b, 0 đến
    >>> from hashlib import blake2b
    >>> blake2b[b'Hello world'].hexdigest[]
    '6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
    
    1 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 [

    >>> digest is mac1
    True
    >>> mac2 = hmac.HMAC[b"key", b"somedata", digestmod=hashlib.sha512]
    >>> mac1.digest[] == mac2.digest[]
    True
    
    1 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 xây dựng thích hợp [ hoặc ], 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 bằng cách gọi

>>> from hashlib import blake2b
>>> h = blake2b[]
>>> h.update[b'Hello world']
>>> h.hexdigest[]
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'

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í

>>> from hashlib import blake2b
>>> blake2b[b'Hello world'].hexdigest[]
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'

Bạn có thể gọi bao nhiêu lần tùy ý để lặp lại cập nhật hàm băm

>>> from hashlib import blake2b
>>> items = [b'Hello', b' ', b'world']
>>> h = blake2b[]
>>> for item in items:
..     h.update[item]
>>> h.hexdigest[]
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'

Sử dụng các kích thướ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

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

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];

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

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

>>> from hashlib import blake2b
>>> blake2b[b'Hello world'].hexdigest[]
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
9 bằng khóa
>>> from hashlib import blake2b
>>> items = [b'Hello', b' ', b'world']
>>> h = blake2b[]
>>> for item in items:
..     h.update[item]
>>> h.hexdigest[]
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
0

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

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

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

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 cấu trúc HMAC với mô-đun

>>> hashlib.sha256[b"Nobody inspects the spammish repetition"].hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
4

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 để biết thêm thông tin

>>> hashlib.sha256[b"Nobody inspects the spammish repetition"].hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
5

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

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

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

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

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á

>>> hashlib.sha256[b"Nobody inspects the spammish repetition"].hexdigest[]
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
8

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

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

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 Sự cống hiến cho miền công cộng của Creative Commons 1. 0 Phổ thông

  • Alexandr Sokolovskiy

Xem thêm

mô-đun

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

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. net

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

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

Hàm băm Python hoạt động như thế nào?

Băm Python[] . Giá trị băm chỉ là số nguyên được sử dụng để so sánh các khóa từ điển trong quá trình tra cứu từ điển nhanh chóng

Python sử dụng phương thức băm nào?

Vậy là xong. Python sử dụng SipHash vì đây là hàm băm mật mã, đáng tin cậy sẽ ngăn chặn các cuộc tấn công xung đột.

Làm cách nào để chuyển đổi chuỗi thành hàm băm trong Python?

mã hóa[] . Chuyển đổi chuỗi thành byte để được hàm băm chấp nhận. tiêu[]. Trả về dữ liệu được mã hóa ở định dạng byte. hexdigest[]. Trả về dữ liệu được mã hóa ở định dạng thập lục phân.

Python có bảng băm tích hợp không?

Một trong những triển khai quan trọng nhất bao gồm Bảng băm. Trong Python, các bảng Băm này được triển khai thông qua kiểu dữ liệu tích hợp sẵn i. e, từ điển .

Chủ Đề