Kiến thức về hàm Hash

Hash (Hàm băm) là gì?

Hashing là quá trình biến một dữ liệu đầu vào có độ dài bất kỳ thành một chuỗi đầu ra đặc trưng có độ dài cố định. Quá trình Hashing diễn ra thông qua hàm băm (hash function).

Một cách tổng quát hàm băm là bất kỳ hàm nào có thể được sử dụng để ánh xạ dữ liệu có kích thước tùy ý thành các giá trị kích thước cố định. Các giá trị được trả về bởi hàm băm được gọi là thông điệp băm, giá trị băm, mã băm hoặc “hash”.

Hàm băm mật mã 

Hàm băm mật mã là các hàm băm phù hợp để sử dụng trong mật mã. Nó là một thuật toán toán học ánh xạ dữ liệu có kích thước tùy ý thành một chuỗi bit có kích thước cố định (gọi là “giá trị băm”, “mã băm” hoặc “thông điệp băm”) và không thể đảo ngược trở lại giá trị ban đầu.

Tính chất của hàm băm mật mã

  • Tính tất định: Cùng một thông điệp đầu vào luôn tạo ra cùng một hàm băm.
  • Tính hiệu quả: Có khả năng tính toán nhanh chóng giá trị băm của bất kỳ thông điệp nào.
  • Tính nhạy cảm: Đảm bảo rằng bất kỳ một thay đổi nào, dù là nhỏ nhất trên dữ liệu đều sẽ gây ra sự thay đổi cực lớn trên giá trị băm và tạo ra giá trị băm hoàn toàn khác, và không hề có liên hệ gì với giá trị băm cũ (hiệu ứng tuyết lở).

Cách thức hoạt động của Hash 

Bản chất của một crypto là blockchain, mà là một sổ kế toán toàn cầu được hình thành bằng cách liên kết khối với nhau riêng biệt của dữ liệu giao dịch. Blockchain chỉ chứa các giao dịch được xác thực, giúp ngăn chặn các giao dịch gian lận và chi tiêu gấp đôi tiền tệ. Giá trị được mã hóa kết quả là một chuỗi các số và chữ cái không giống với dữ liệu gốc và được gọi là hàm băm. Khai thác tiền điện tử liên quan đến việc làm việc với hàm băm này.

Hash (Băm) yêu cầu xử lý dữ liệu từ một khối thông qua hàm toán học, dẫn đến kết quả đầu ra có độ dài cố định. Sử dụng đầu ra có độ dài cố định sẽ tăng tính bảo mật vì bất kỳ ai cố gắng giải mã hàm băm sẽ không thể biết đầu vào dài hay ngắn chỉ bằng cách nhìn vào độ dài của đầu ra.

Giải quyết hàm băm về cơ bản là giải quyết một vấn đề toán học phức tạp và bắt đầu với dữ liệu có sẵn trong tiêu đề khối. Mỗi tiêu đề khối chứa một số phiên bản, dấu thời gian, hàm băm được sử dụng trong khối trước đó, hàm băm của Merkle Root, nonce .

Công cụ khai thác tập trung vào nonce, một chuỗi số. Số này được gắn vào nội dung được băm của khối trước đó, sau đó chính nó được băm. Nếu hàm băm mới này nhỏ hơn hoặc bằng giá trị băm mục tiêu, thì nó được chấp nhận làm giải pháp, người khai thác được trao phần thưởng và khối được thêm vào blockchain.

Quá trình xác nhận cho các giao dịch blockchain dựa trên dữ liệu được mã hóa bằng cách sử dụng băm thuật toán.

Việc giải hàm băm yêu cầu người khai thác xác định chuỗi nào sẽ sử dụng làm chuỗi không, chính nó yêu cầu một số lượng đáng kể thử và sai. Điều này là do nonce là một chuỗi ngẫu nhiên. Rất khó có khả năng một người khai thác sẽ thành công với lần đầu tiên chính xác trong lần thử đầu tiên, có nghĩa là người khai thác có thể có khả năng kiểm tra một số lượng lớn các tùy chọn nonce trước khi thực hiện đúng. Khó khăn càng lớn, thước đo mức độ khó của việc tạo ra một hash đáp ứng yêu cầu của hash mục tiêu càng lâu thì càng có khả năng để tạo ra một giải pháp.

Tỷ lệ băm là gì?

Tốc độ băm về cơ bản có nghĩa là các hoạt động băm này diễn ra nhanh như thế nào trong khi khai thác. Tỷ lệ băm cao có nghĩa là nhiều người và phần mềm là các máy đang tham gia vào quá trình khai thác và kết quả là hệ thống đang hoạt động trơn tru. Nếu tốc độ băm quá nhanh, mức độ khó sẽ tăng lên. Nếu tốc độ băm trở nên quá chậm thì mức độ khó sẽ giảm.

Tỷ lệ băm là gì?

Các dạng Hash (hàm băm) cơ bản

Hàm băm MD5

MD5 được Ronald Rivest thiết kế vào năm 1991 để thay thế hàm băm MD4 và được đưa thành tiêu chuẩn vào năm 1992 trong RFC 1321. 

MD5 tạo ra một bản tóm tắt có kích thước 128 bit (16 byte). Tuy nhiên, nó đã không an toàn trước sức mạnh tính toán của các hệ thống tính toán thế hệ mới. 

SHA-1

SHA-1 được phát triển như một phần của dự án Capstone của Chính phủ Hoa Kỳ. SHA-1 tạo ra bản tóm tắt có kích thước 160 bit (20 byte). Các va chạm chống lại thuật toán SHA-1 đầy đủ có thể được tạo ra bằng cách sử dụng tấn công phá vỡ. Do đó, hàm băm này cho đến nay được coi là không đủ an toàn.

RIPEMD-160

RIPEMD (RACE Integrity Primitives Evaluation Message Digest) là họ hàm băm được phát triển tại Leuven, Bỉ. Bởi ba nhà mật mã học Hans Dobbertin, Antoon Bosselaers và Bart Preneel của nhóm nghiên cứu COSIC thuộc đại học Katholieke Universiteit Leuven.  RIPEMD công bố vào năm 1996 dựa trên các nguyên tắc thiết kế được sử dụng trong MD4. RIPEMD-160 tạo ra một bản tóm tắt gồm 160 bit (20 byte). RIPEMD có hiệu năng tương tự như SHA-1 nhưng ít được phổ biến hơn. Và cho đến nay RIPEMD-160 chưa bị phá vỡ.

Bcrypt

Bcrypt là một hàm băm mật khẩu được thiết kế bởi Niels Provos và David Mazières, dựa trên mật mã Blowfish, và được trình bày tại USENIX vào năm 1999. 

hàm băm Bcrypt

Bên cạnh việc kết hợp một giá trị ngẫu nhiên salt để bảo vệ chống lại các tấn công rainbow attack, bcrypt còn là một hàm có khả năng thích ứng: theo thời gian, số lần lặp có thể được tăng lên để làm cho nó chậm hơn, do đó nó vẫn có khả năng chống lại các cuộc tấn công vét cạn ngay cả khi tăng sức mạnh tính toán có lớn đến mức nào đi chăng nữa.

Whirlpool

Whirlpool là một hàm băm mật mã do Vincent Rijmen và Paulo S. L. M. Barreto thiết kế. Nó được mô tả đầu tiên vào năm 2000. Whirlpool dựa trên phiên bản sửa đổi đáng kể của Tiêu chuẩn mã hóa nâng cao (AES). Whirlpool tạo ra một bản tóm tắt có độ dài 512 bit (64 byte) của dữ liệu.

SHA-2

SHA-2 là một tập hợp các hàm băm mật mã được thiết kế bởi Cơ quan an ninh quốc gia Hoa Kỳ (NSA), được xuất bản lần đầu tiên vào năm 2001. Chúng được xây dựng bằng cấu trúc Merkle–Damgård, chức năng nén một chiều của nó được xây dựng bằng cấu trúc Davies–Meyer từ một hệ mật mã khối chuyên dụng.

Về bản chất SHA-2 gồm hai thuật toán băm là SHA-256 và SHA-512. SHA-224 là một biến thể của SHA-256 với các giá trị khởi tạo và đầu ra bị cắt bỏ khác nhau. SHA-384 và SHA-512/224 và SHA-512/256 ít được biết đến là tất cả các biến thể của SHA-512. SHA-512 an toàn hơn SHA-256 và thường nhanh hơn SHA-256 trên các máy 64 bit như AMD64.

Do có nhiều phiên bản thuật toán khác nhau do đó kích thước đầu ra của họ SHA-2 cũng khác nhau tùy theo thuật toán. Phần mở rộng của tên phía sau tiền tố “SHA” chính là độ dài của thông điệp băm đầu ra. Ví dụ với SHA-224 thì kích thước đầu ra là 224 bit (28 byte), SHA-256 tạo ra 32 byte, SHA-384 tạo ra 48 byte và cuối cùng là SHA- 512 tạo ra 64 byte. Và chúng ta có thể đã biết rằng Bitcoin sử dụng hàm băm SHA-256 là một phiên bản trong họ SHA-2 này.

SHA-3

SHA-3 hay còn được gọi là Keccak (nền tảng nguyên thủy cho các thuật toán hiện tại) được NIST phát hành vào ngày 5 tháng 8 năm 2015. Đây có lẽ là tiêu chuẩn hàm băm mới nhất cho đến hiện nay. Thuật toán Keccak được đưa ra bởi Guido Bertoni, Joan Daemen, Michael Peeters và Gilles Van Assche. Keccak dựa trên cấu trúc bọt biển (sponge). Cấu trúc này cũng có thể được sử dụng để xây dựng các nguyên thủy mã hóa khác như các hệ mật mã dòng. SHA-3 cũng có các kích cỡ đầu ra tương tự như SHA-2 bao gồm: 224, 256, 384 và 512 bit.

BLAKE2

Một phiên bản cải tiến của BLAKE có tên BLAKE2 đã được công bố vào ngày 21 tháng 12 năm 2012. BLAKE được phát triển bởi Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O’Hearn và Christian Winnerlein với mục tiêu thay thế các thuật toán băm phổ biến như MD5 và SHA-1. Khi chạy trên các kiến ​​trúc 64 bit x64 và ARM, BLAKE2b cho tốc độ nhanh hơn SHA-3, SHA-2, SHA-1 và MD5. Mặc dù BLAKE và BLAKE2 chưa được tiêu chuẩn hóa như SHA-3, nhưng nó đã được sử dụng trong nhiều giao thức bao gồm hàm băm mật khẩu Argon2 do hiệu quả cao mà nó mang lại cho các dòng CPU hiện đại. Do BLAKE cũng là ứng cử viên cho tiêu chuẩn SHA-3, vì vậy, BLAKE và BLAKE2 đều có các kích thước đầu ra giống như SHA-3 và có thể tùy chọn khi sử dụng trong thực tế.

Ứng dụng của Hash

Hashing trong định danh tệp hoặc dữ liệu

Giá trị băm cũng có thể được sử dụng như một phương tiện để định danh tập tin một cách đáng tin cậy. Một số hệ thống quản lý mã nguồn, như Git, Mercurial hay Monotone, sử dụng giá trị sha1sum của nội dung tệp, cây thư mục, thông tin thư mục gốc,… để định danh chúng.

Giá trị băm cũng được sử dụng để xác định các tệp trên các mạng chia sẻ tệp ngang hàng nhằm cung cấp đầy đủ thông tin để định vị nguồn gốc của tệp, xác minh nội dung tệp tải xuống. Giá trị ứng dụng của chúng còn được mở rộng ra khi áp dụng các cấu trúc dữ liệu bổ sung như danh sách băm hoặc cây băm (Merkle Tree).

Tuy nhiên, so với các hàm băm tiêu chuẩn, các hàm băm mật mã có xu hướng phức tạp và đòi hỏi nhiều tài nguyên tính toán hơn nhiều. Do đó, chúng có xu hướng được sử dụng trong các trường hợp khi người dùng cần tự bảo vệ tính an toàn cho thông điệp trước các khả năng bị sửa đổi, hay giả mạo như các ứng dụng ở dưới đây:

Hashing trong xác minh tính toàn vẹn của thông điệp hoặc tập tin

Một ứng dụng quan trọng nhất của hashing là xác minh tính toàn vẹn của thông điệp.Chúng ta khá quen thuộc với các ứng dụng này. Khi download một phần mềm hoặc tệp tin nào đó trên một số trang web, ta được cung cấp kèm theo các mã băm MD5 hoặc SHA1. Khi đó sau khi tải về tập tin, chúng ta có thể tính và so sánh giá trị băm của tệp tải về với giá trị băm được cung cấp trên web, nếu có sự sai khác tức là tệp tin chúng ta tải về đã bị sửa đổi.

Hashing trong tạo và xác nhận chữ ký

Hầu như tất cả các lược đồ chữ ký số đều yêu cầu tính toán bản tóm lược của thông điệp bằng các hàm băm mật mã. Điều này cho phép việc tính toán và tạo chữ ký được thực hiện trên một khối dữ liệu có kích thước tương đối nhỏ và cố định thay vì trên toàn bộ văn bản dài. Tính chất toàn vẹn thông điệp của hàm băm mật mã được sử dụng để tạo các lược đồ chữ ký số an toàn và hiệu quả.

Hashing trong tạo và xác nhận chữ ký

Hashing trong xác minh mật khẩu

Việc xác minh mật khẩu thường dựa vào các hàm băm mật mã. Mật khẩu người dùng nếu được dưới dạng bản rõ có thể dẫn đến những lỗ hổng bảo mật nghiêm trọng khi tệp mật khẩu bị xâm phạm. Do đó, để làm giảm nguy cơ này, chúng ta thường chỉ lưu trữ giá trị băm của mỗi mật khẩu. Để xác thực người dùng, mật khẩu do người dùng nhập vào được băm và so sánh với giá trị băm được lưu trữ tương ứng. Mật khẩu ban đầu không thể được tính toán lại từ giá trị băm được lưu trữ trong cơ sở dữ liệu.

Hashing trong xác minh mật khẩu

Các hàm băm mật mã tiêu chuẩn được thiết kế để được tính toán nhanh chóng và do đó, có thể thử dò đoán mật khẩu với tốc độ cực cao. Các đơn vị xử lý đồ họa (GPU) thông thường có thể thử đoán hàng tỷ mật khẩu có thể mỗi giây. Do đó, để tăng tính án toàn, các hàm băm mật khẩu thực hiện việc mở rộng khóa – chẳng hạn như PBKDF2, scrypt hoặc Argon2 – thường sử dụng các lệnh gọi lặp lại của hàm băm mật mã để tăng thời gian (và trong một số trường hợp bộ nhớ máy tính) cần thiết để thực hiện các cuộc tấn công vét cạn lên giá trị băm của mật khẩu được lưu trữ. Việc hashing mật khẩu yêu cầu sử dụng một giá trị muối (salt) ngẫu nhiên, có thể được lưu trữ với hàm băm mật khẩu. Giá trị salt làm ngẫu nhiên hóa đầu ra của hàm băm mật khẩu, khiến đối thủ không thể lưu trữ các bảng mật khẩu và các giá trị băm được tính toán trước.

Đầu ra của hàm băm mật khẩu cũng có thể được sử dụng làm các khóa mật mã. Do đó, các hàm băm mật khẩu còn được gọi là các Hàm dẫn xuất khóa dựa trên mật khẩu (PBKDF).

Hashing và Proof of Work

Bằng chứng công việc (Proof of Work) là một biện pháp kinh tế để ngăn chặn các cuộc tấn công từ chối dịch vụ và các hành vi lạm dụng dịch vụ khác như spam bằng cách yêu cầu người dùng dịch vụ thực hiện một số công việc nhất định, thường đòi hỏi nhiều thời gian xử lý. Bằng chứng công việc cần đảm bảo tính bất đối xứng tức là: công việc phải có độ khó vừa phải (nhưng khả thi) về phía người dùng nhưng dễ kiểm chứng đối với nhà cung cấp dịch vụ.

Hashing và Bằng chứng công việc (Proof of Work)

Hệ thống Proof of Work đầu tiên được đề xuất là Hashcash. Hashcash sử dụng quá trình hashing như một phần để chứng minh rằng công việc đã được thực hiện nhằm cho phép gửi email đi, tránh các email spam. Công việc trung bình mà người dùng cần thực hiện để tìm thư hợp lệ cấp số nhân với số bit 0 cần thiết trong giá trị băm, trong khi người nhận có thể xác minh tính hợp lệ của email chỉ bằng cách thực hiện một phép tính băm duy nhất. Trong Hashcash, người gửi được yêu cầu tạo một tiêu đề có giá trị băm SHA-1 160 bit trong đó có 20 bit đầu tiên là bit 0. Khi đó, người gửi trung bình sẽ phải thử khoảng2^{19}lần để tìm ra tiêu đề hợp lệ trước khi gửi đi.

Hashing trong blockchain

Một số hàm băm mật mã đang được sử dụng rộng rãi như đã kể ở trên:

  • SHA 256 hiện đang được sử dụng bởi Bitcoin.
  • Keccak-256 hiện đang được Ethereum sử dụng.

Hashing trong blockchain

Ứng dụng của Hash

Các hàm băm này không những được sử dụng để tạo ra bằng chứng công việc (Proof of Work) mà còn để làm định danh cho các khối, hoặc kết hợp với mật mã khóa công khai để tạo ra định danh cho người dùng trên mạng.

Ứng dụng hashing trong xây dựng các thành phần nguyên thuỷ mật mã khác

Các hàm băm cũng có thể được sử dụng để xây dựng các thành phần nguyên thuỷ mật mã khác.

Đầu tiên, hàm băm có thể được sử dụng để xây dựng các mã xác thực thông điệp (MAC) (còn được gọi là hàm băm có khóa) như HMAC.

Hàm băm cũng có thể được sử dụng để xây dựng các hệ mật mã khối. Các cấu trúc Luby-Rackoff được xây dựng sử dụng các hàm băm và dựa trên độ an toàn của hàm băm.

Trình tạo số giả ngẫu nhiên (PRNG) cũng có thể được xây dựng dựa trên các hàm băm. Điều này được thực hiện bằng cách kết hợp một mầm ngẫu nhiên (bí mật) với một bộ đếm và tiến hành băm nó.

Một số hàm băm, chẳng hạn như Skein, Keccak và RadioGatún tạo ra một luồng dài tùy ý và có thể được sử dụng trong các hệ mật mã dòng.

Ý nghĩa của Hash trong Blockchain

Xương sống của một loại tiền điện tử là blockchain của nó, là một sổ cái toàn cầu được hình thành bằng cách liên kết các khối dữ liệu giao dịch riêng lẻ với nhau. Blockchain chỉ chứa các giao dịch được xác thực, giúp ngăn chặn các giao dịch gian lận và chi tiêu gấp đôi tiền tệ. Quá trình xác nhận dựa trên dữ liệu được mã hóa bằng cách sử dụng băm thuật toán. Giá trị được mã hóa kết quả là một chuỗi các số và chữ cái không giống với dữ liệu gốc và được gọi là hàm băm. Khai thác tiền điện tử liên quan đến việc làm việc với hàm băm này.

Băm yêu cầu xử lý dữ liệu từ một khối thông qua hàm toán học, dẫn đến kết quả đầu ra có độ dài cố định. Sử dụng đầu ra có độ dài cố định sẽ tăng tính bảo mật, vì bất kỳ ai đang cố gắng giải mã hàm băm không thể cho biết đầu vào dài hay ngắn chỉ bằng cách nhìn vào độ dài của đầu ra. Hàm được sử dụng để tạo hàm băm có tính xác định, nghĩa là nó sẽ tạo ra cùng một kết quả mỗi lần sử dụng cùng một đầu vào; có thể tạo ra một đầu vào băm hiệu quả; làm cho việc xác định đầu vào khó khăn (dẫn đến khai thác); và thực hiện các thay đổi nhỏ đối với kết quả đầu vào trong hàm băm rất khác nhau.

Việc xử lý các hàm băm cần thiết để mã hóa các khối mới đòi hỏi sức mạnh xử lý đáng kể của máy tính, có thể tốn kém. Để lôi kéo các cá nhân và công ty, được gọi là người khai thác, đầu tư vào công nghệ cần thiết, các mạng tiền điện tử thưởng cho họ cả token tiền điện tử mới và phí giao dịch. Công cụ khai thác chỉ được bù nếu chúng là người đầu tiên tạo ra hàm băm đáp ứng các yêu cầu được đặt ra trong hàm băm đích.

Giải quyết hàm băm về cơ bản là giải quyết một vấn đề toán học phức tạp và bắt đầu với dữ liệu có sẵn trong tiêu đề khối. Mỗi tiêu đề khối chứa một số phiên bản, dấu thời gian, hàm băm được sử dụng trong khối trước đó, hàm băm của Merkle Root, nonce và băm đích. Công cụ khai thác tập trung vào nonce, một chuỗi số. Số này được gắn vào nội dung được băm của khối trước đó, sau đó chính nó được băm. Nếu hàm băm mới này nhỏ hơn hoặc bằng hàm băm mục tiêu, thì nó được chấp nhận làm giải pháp, người khai thác được trao phần thưởng và khối được thêm vào blockchain.

Việc giải hàm băm yêu cầu người khai thác xác định chuỗi nào sẽ sử dụng làm chuỗi không, chính nó yêu cầu một số lượng đáng kể thử và sai. Điều này là do nonce là một chuỗi ngẫu nhiên. Rất khó có khả năng một người khai thác sẽ thành công với lần đầu tiên chính xác trong lần thử đầu tiên, có nghĩa là người khai thác có thể kiểm tra một số lượng lớn các tùy chọn nonce trước khi thực hiện đúng. Độ khó càng lớn – thước đo mức độ khó để tạo ra một hàm băm đáp ứng yêu cầu của hàm băm mục tiêu – càng mất nhiều thời gian để tạo ra một giải pháp.

Nếu bài viết này mang lại kiến thức giá trị hãy chia sẻ cho mọi người cùng biết đến.

Thân ái!

>> Xem thêm: Blockchain là gì?

>> Xem thêm: Quá trình tiến hoá của Blockchain

icons8-exercise-96