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 Show 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ămCó 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() True0. 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() True1 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() True2 >>> 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ảoMộ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ẵnMộ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_sizeKích thước của hàm băm kết quả tính bằng byte băm. block_sizeKí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ênTê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() True8 tương đương với >>> digest is mac1 True >>> mac2 = hmac.HMAC(b"key", b"somedata", digestmod=hashlib.sha512) >>> mac1.digest() == mac2.digest() True9 Đã 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. 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 SHAKECá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ẮClắ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 255lắ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 tinMô-đ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óaThuậ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ốihashlib. 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 BLACK2BLAKE2 là một hàm băm mật mã được xác định trong RFC 7693 có hai loại
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ămCá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
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
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_SIZEChiề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_SIZEKích thước khóa tối đa blake2b. MAX_DIGEST_SIZEblake2s. MAX_DIGEST_SIZEKí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 nhauBLAKE2 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óaBă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ênBằ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ố
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
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ụngBLAKE2 đượ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
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
Xem thêm mô-đunMộ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ô-đunMộ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. netTrang 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 . |