HMAC trong Python là gì?

Trong mật mã học, HMAC [đôi khi được mở rộng dưới dạng mã xác thực thông báo băm có khóa hoặc mã xác thực thông báo dựa trên hàm băm] là một loại mã xác thực thông báo [MAC] cụ thể liên quan đến hàm băm mật mã và khóa mật mã bí mật. Như với bất kỳ MAC nào, nó có thể được sử dụng để xác minh đồng thời cả tính toàn vẹn dữ liệu và tính xác thực của thông báo

HMAC có thể cung cấp xác thực bằng cách sử dụng bí mật chung thay vì sử dụng chữ ký số với mật mã bất đối xứng. Nó đánh đổi nhu cầu về cơ sở hạ tầng khóa công khai phức tạp bằng cách ủy quyền trao đổi khóa cho các bên liên lạc, những người chịu trách nhiệm thiết lập và sử dụng một kênh đáng tin cậy để đồng ý về khóa trước khi liên lạc

Chi tiết[sửa]

Bất kỳ hàm băm mật mã nào, chẳng hạn như SHA-2 hoặc SHA-3, có thể được sử dụng để tính toán HMAC; . g. HMAC-SHA256 hoặc HMAC-SHA3-512]. Độ mạnh mã hóa của HMAC phụ thuộc vào độ mạnh mã hóa của hàm băm cơ bản, kích thước đầu ra băm của nó, kích thước và chất lượng của khóa

HMAC sử dụng hai lần tính toán hàm băm. Trước khi vượt qua, khóa bí mật được sử dụng để lấy hai khóa - bên trong và bên ngoài. Tiếp theo, bước đầu tiên của thuật toán băm tạo ra một hàm băm bên trong bắt nguồn từ thông báo và khóa bên trong. Lần thứ hai tạo ra mã HMAC cuối cùng bắt nguồn từ kết quả hàm băm bên trong và khóa bên ngoài. Do đó, thuật toán cung cấp khả năng miễn dịch tốt hơn trước các cuộc tấn công mở rộng chiều dài

Hàm băm lặp [hàm sử dụng cấu trúc Merkle–Damgård] chia thông báo thành các khối có kích thước cố định và lặp lại chúng bằng hàm nén. Ví dụ: SHA-256 hoạt động trên các khối 512 bit. Kích thước đầu ra của HMAC giống như kích thước của hàm băm bên dưới [e. g. , 256 và 512 bit trong trường hợp SHA-256 và SHA3-512, tương ứng], mặc dù nó có thể bị cắt bớt nếu muốn

HMAC không mã hóa tin nhắn. Thay vào đó, tin nhắn [được mã hóa hoặc không] phải được gửi cùng với hàm băm HMAC. Các bên có khóa bí mật sẽ tự băm lại tin nhắn và nếu nó là xác thực, thì giá trị băm nhận được và tính toán sẽ khớp với nhau

Định nghĩa và phân tích về cấu trúc HMAC lần đầu tiên được xuất bản vào năm 1996 trong một bài báo của Mihir Bellare, Ran Canetti và Hugo Krawczyk, và họ cũng đã viết RFC 2104 vào năm 1997. Bài báo năm 1996 cũng định nghĩa một biến thể lồng nhau gọi là NMAC [Nested MAC]. FIPS PUB 198 khái quát hóa và tiêu chuẩn hóa việc sử dụng HMAC. HMAC được sử dụng trong các giao thức IPsec, SSH và TLS và cho Mã thông báo Web JSON

Định nghĩa[sửa]

Định nghĩa này được lấy từ RFC 2104

HMAC⁡[K,m]=H⁡[[K′⊕opad]∥H⁡[[K′⊕ipad]∥m]]K′={H⁡[K]nếu K lớn hơn

ở đâu

H là hàm băm mật mã. m là tin nhắn được xác thực. K là khóa bí mật. K' là khóa có kích thước khối bắt nguồn từ khóa bí mật, K; . ‖ biểu thị nối. ⊕ biểu thị loại trừ bitwise hoặc [XOR]. opad là phần đệm bên ngoài có kích thước khối, bao gồm các byte lặp lại có giá trị 0x5c. ipad là phần đệm bên trong có kích thước khối, bao gồm các byte lặp lại có giá trị 0x36

Thực hiện[sửa]

Mã giả sau minh họa cách HMAC có thể được triển khai. Kích thước khối là 512 bit [64 byte] khi sử dụng một trong các hàm băm sau. SHA-1, MD5, RIPEMD-128

function hmac is
    input:
        key:        Bytes    // Array of bytes
        message:    Bytes    // Array of bytes to be hashed
        hash:       Function // The hash function to use [e.g. SHA-1]
        blockSize:  Integer  // The block size of the hash function [e.g. 64 bytes for SHA-1]
        outputSize: Integer  // The output size of the hash function [e.g. 20 bytes for SHA-1]

    // Compute the block sized key
    block_sized_key = computeBlockSizedKey[key, hash, blockSize]

    o_key_pad ← block_sized_key xor [0x5c blockSize]   // Outer padded key
    i_key_pad ← block_sized_key xor [0x36 blockSize]   // Inner padded key

    return  hash[o_key_pad ∥ hash[i_key_pad ∥ message]]

function computeBlockSizedKey is
    input:
        key:        Bytes    // Array of bytes
        hash:       Function // The hash function to use [e.g. SHA-1]
        blockSize:  Integer  // The block size of the hash function [e.g. 64 bytes for SHA-1]
 
    // Keys longer than blockSize are shortened by hashing them
    if [length[key] > blockSize] then
        key = hash[key]

    // Keys shorter than blockSize are padded to blockSize by padding with zeros on the right
    if [length[key] < blockSize] then
        return  Pad[key, blockSize] // Pad key with zeros to make it blockSize bytes long

    return  key

Nguyên tắc thiết kế[sửa | sửa mã nguồn]

Thiết kế của đặc tả HMAC được thúc đẩy bởi sự tồn tại của các cuộc tấn công vào các cơ chế tầm thường hơn để kết hợp khóa với hàm băm. Ví dụ: người ta có thể cho rằng có thể đạt được mức bảo mật tương tự mà HMAC cung cấp với MAC = H[key ∥ message]. Tuy nhiên, phương pháp này có một lỗ hổng nghiêm trọng. với hầu hết các hàm băm, thật dễ dàng để thêm dữ liệu vào thông báo mà không cần biết khóa và lấy MAC hợp lệ khác ["tấn công mở rộng độ dài"]. Phương án thay thế, nối thêm khóa bằng cách sử dụng MAC = H[thông báo ∥ khóa], gặp phải sự cố là kẻ tấn công có thể tìm thấy xung đột trong hàm băm [không khóa] sẽ xảy ra xung đột trong MAC [vì hai thông báo m1 và m2 tạo ra . Sử dụng MAC = H[key ∥ message ∥ key] sẽ tốt hơn, nhưng nhiều tài liệu bảo mật đã đề xuất các lỗ hổng với phương pháp này, ngay cả khi sử dụng hai khóa khác nhau

Không có cuộc tấn công mở rộng đã biết nào được tìm thấy đối với đặc tả HMAC hiện tại được định nghĩa là H[key ∥ H[key ∥ message]] vì ứng dụng bên ngoài của hàm băm che giấu kết quả trung gian của hàm băm bên trong. Các giá trị của ipad và opad không quan trọng đối với tính bảo mật của thuật toán, nhưng được xác định theo cách có khoảng cách Hamming lớn với nhau và do đó, các khóa bên trong và bên ngoài sẽ có ít bit chung hơn. Việc giảm bảo mật của HMAC yêu cầu chúng phải khác nhau ít nhất một chút. [cần dẫn nguồn]

Hàm băm Keccak, được NIST chọn là người chiến thắng trong cuộc thi SHA-3, không cần phương pháp lồng nhau này và có thể được sử dụng để tạo MAC bằng cách chỉ cần thêm khóa vào thông báo, vì nó không dễ bị ảnh hưởng bởi độ dài-

Bảo mật[sửa]

Độ mạnh mật mã của HMAC phụ thuộc vào kích thước của khóa bí mật được sử dụng và tính bảo mật của hàm băm cơ bản được sử dụng. Người ta đã chứng minh rằng tính bảo mật của cấu trúc HMAC liên quan trực tiếp đến các thuộc tính bảo mật của hàm băm được sử dụng. Cuộc tấn công phổ biến nhất đối với HMAC là vũ phu để khám phá khóa bí mật. Về cơ bản, các HMAC ít bị ảnh hưởng bởi va chạm hơn so với các thuật toán băm cơ bản của chúng. Đặc biệt, Mihir Bellare đã chứng minh rằng HMAC là một PRF với giả định duy nhất rằng hàm nén là một PRF. Do đó, HMAC-MD5 không có các điểm yếu tương tự đã được tìm thấy trong MD5

RFC 2104 yêu cầu "các khóa dài hơn B byte trước tiên được băm bằng H" dẫn đến va chạm giả khó hiểu. nếu khóa dài hơn kích thước khối băm [e. g. 64 byte cho SHA-1], thì HMAC[k, m] được tính là HMAC[H[k], m]. Thuộc tính này đôi khi được coi là điểm yếu có thể có của HMAC trong các tình huống băm mật khẩu. người ta đã chứng minh rằng có thể tìm thấy một chuỗi ASCII dài và một giá trị ngẫu nhiên có hàm băm cũng sẽ là một chuỗi ASCII và cả hai giá trị sẽ tạo ra cùng một đầu ra HMAC

Năm 2006, Jongsung Kim, Alex Biryukov, Bart Preneel và Seokhie Hong đã chỉ ra cách phân biệt HMAC với các phiên bản rút gọn của MD5 và SHA-1 hoặc các phiên bản đầy đủ của HAVAL, MD4 và từ chức năng ngẫu nhiên hoặc HMAC với chức năng ngẫu nhiên. Bộ phân biệt khác biệt cho phép kẻ tấn công nghĩ ra một cuộc tấn công giả mạo trên HMAC. Hơn nữa, các bộ phân biệt vi phân và hình chữ nhật có thể dẫn đến các cuộc tấn công tiền ảnh thứ hai. HMAC với phiên bản đầy đủ của MD4 có thể được giả mạo với kiến ​​​​thức này. Các cuộc tấn công này không mâu thuẫn với bằng chứng bảo mật của HMAC, nhưng cung cấp cái nhìn sâu sắc về HMAC dựa trên các hàm băm mật mã hiện có

In 2009, Xiaoyun Wang et al. đã trình bày một cuộc tấn công khác biệt vào HMAC-MD5 mà không sử dụng các khóa liên quan. Nó có thể phân biệt việc khởi tạo HMAC với MD5 với việc khởi tạo bằng hàm ngẫu nhiên có 297 truy vấn với xác suất 0. 87

Vào năm 2011, một thông tin RFC 6151 đã được xuất bản để tóm tắt các cân nhắc về bảo mật trong MD5 và HMAC-MD5. Đối với HMAC-MD5, RFC tóm tắt rằng – mặc dù tính bảo mật của bản thân hàm băm MD5 bị xâm phạm nghiêm trọng – “các cuộc tấn công vào HMAC-MD5 hiện được biết đến dường như không chỉ ra một lỗ hổng thực tế khi được sử dụng làm mã xác thực thư”, nhưng nó

Vào tháng 5 năm 2011, RFC 6234 đã được xuất bản nêu chi tiết về lý thuyết trừu tượng và mã nguồn cho các HMAC dựa trên SHA

HMAC dùng để làm gì?

Mã xác thực thông báo dựa trên hàm băm [hoặc HMAC] là một kỹ thuật xác thực bằng mật mã sử dụng hàm băm và khóa bí mật. Với HMAC, bạn có thể đạt được xác thực và xác minh rằng dữ liệu là chính xác và xác thực bằng các bí mật được chia sẻ , trái ngược với các phương pháp sử dụng chữ ký và mật mã bất đối xứng.

HMAC có nghĩa là gì?

Mã xác thực thư dựa trên hàm băm [HMAC]

Làm cách nào để tạo HMAC bằng Python?

Trước tiên, chúng tôi xây dựng một phiên bản của HMAC bằng phương thức new[], chuyển các byte cho khóa và thông báo và “sha1” cho thuật toán băm. The new[] method generates an instance of HMAC with a bytes-based initial message. It can then be used to produce code for message authentication.

HMAC có giống MAC không?

Trong mật mã học, HMAC [đôi khi được mở rộng thành mã xác thực thông báo băm có khóa hoặc mã xác thực thông báo dựa trên hàm băm] là một loại mã xác thực thông báo [MAC] cụ thể< . involving a cryptographic hash function and a secret cryptographic key.

Chủ Đề