Bỏ qua đến nội dung chính

Entropy và Tính Ngẫu Nhiên Trong Tiền Mã Hóa: Vì Sao Nó Quan Trọng

Mọi khóa riêng tư tiền mã hóa, mọi cụm từ hạt giống, và mọi địa chỉ bạn dùng đều bắt đầu từ một số ngẫu nhiên. Độ an toàn của toàn bộ danh mục crypto của bạn dựa trên một giả định: số đó thực sự không thể dự đoán. Nếu bộ tạo số ngẫu nhiên tạo ra khóa của bạn yếu, thiên lệch hoặc có thể đoán trước, tiền của bạn có thể bị đánh cắp, không phải bằng cách phá mật mã, mà bằng cách đoán khóa.

Hướng dẫn này giải thích entropy nghĩa là gì trong bối cảnh mật mã, cách các bộ tạo số ngẫu nhiên hoạt động, điều gì đã từng xảy ra trong lịch sử khi tính ngẫu nhiên thất bại, và cách đảm bảo quá trình tạo khóa của bạn là đáng tin cậy.

Entropy Là Gì?

Trong lý thuyết thông tin, entropy đo lượng bất định hoặc không thể dự đoán trong một phần dữ liệu. Trong mật mã học, entropy định lượng số bit ngẫu nhiên thực sự mà một giá trị chứa.

Một khóa riêng tư 256-bit nên có 256 bit entropy, nghĩa là kẻ tấn công phải thử trung bình 2^255 lần đoán để tìm ra nó (trung bình là nửa không gian tìm kiếm). Nếu khóa chỉ được tạo với 32 bit entropy thực tế (vì RNG bị lỗi), kẻ tấn công chỉ cần khoảng 2^31 lần đoán, xấp xỉ 2 tỷ, mà máy tính hiện đại có thể vét cạn trong vài phút.

Đo Entropy

Entropy được đo bằng bit. Entropy của một biến ngẫu nhiên X là:

H(X) = -sum(p(x) * log2(p(x))) for all possible values x

Với một số 256-bit ngẫu nhiên đồng đều:

  • Mỗi bit có xác suất 0.5 là 0 hoặc 1.
  • Entropy = 256 bit (mức tối đa cho kích thước này).

Với một bộ tạo thiên lệch trong đó mỗi bit có xác suất 0.7 là 1:

  • Entropy trên mỗi bit = -(0.7 * log2(0.7) + 0.3 * log2(0.3)) = 0.881 bit.
  • Tổng entropy cho 256 bit = 225.5 bit (thấp hơn lý tưởng 11.9%).

Ngay cả thiên lệch nhỏ cũng cộng dồn qua nhiều bit và có thể làm giảm đáng kể mức bảo mật hiệu dụng.

Entropy Trong Bối Cảnh BIP-39

Độ dài mnemonicEntropyMức bảo mậtBrute-force ở 10^12/giây
12 từ128 bit128-bit~10^19 năm
15 từ160 bit160-bit~10^28 năm
18 từ192 bit192-bit~10^38 năm
24 từ256 bit256-bit~10^57 năm

Các con số này giả định entropy thực sự đồng đều. Nếu RNG có lỗi, mức bảo mật thực tế có thể thấp hơn rất nhiều.

Các Loại Bộ Tạo Số Ngẫu Nhiên

Bộ Tạo Số Ngẫu Nhiên Thực (TRNG)

TRNG lấy mẫu các hiện tượng vật lý vốn không thể dự đoán ở cấp độ lượng tử:

  • Nhiễu nhiệt — Dao động điện áp ngẫu nhiên trong điện trở do dao động nhiệt của electron.
  • Nhiễu shot — Dao động ngẫu nhiên của dòng điện do bản chất rời rạc của dòng electron.
  • Phân rã phóng xạ — Thời điểm của từng sự kiện phân rã về bản chất là không thể dự đoán.
  • Nhiễu khí quyển — Nhiễu tần số vô tuyến từ sét và các quá trình khí quyển khác.

Ví Ledger và Trezor sử dụng TRNG trên chip. Chúng lấy mẫu nguồn nhiễu vật lý và xử lý đầu ra qua whitening và kiểm tra sức khỏe.

Ưu điểm: Tính ngẫu nhiên thực từ vật lý; không có trạng thái tất định để dự đoán.
Nhược điểm: Phụ thuộc phần cứng; có thể hỏng âm thầm nếu nguồn nhiễu suy giảm; thông lượng có thể bị giới hạn.

Bộ Tạo Số Giả Ngẫu Nhiên Mật Mã (CSPRNG)

CSPRNG là thuật toán tất định tạo ra đầu ra không thể phân biệt với ngẫu nhiên thực, nếu seed đủ ngẫu nhiên:

  • Linux: /dev/urandom (dùng ChaCha20 hoặc cipher tương tự, seed từ entropy phần cứng).
  • macOS: /dev/urandom (arc4random, seed từ entropy phần cứng).
  • Windows: BCryptGenRandom (CNG provider).
  • Trình duyệt web: crypto.getRandomValues() (ủy thác cho CSPRNG của OS).
  • Python: os.urandom() hoặc module secrets.
  • Node.js: crypto.randomBytes().

Ưu điểm: Nhanh; thuật toán được nghiên cứu kỹ; có trên mọi nền tảng.
Nhược điểm: Chỉ mạnh bằng entropy seed ban đầu; mang tính tất định, nếu trạng thái nội bộ bị lộ thì mọi đầu ra tương lai đều có thể dự đoán.

PRNG Phi Mật Mã (KHÔNG BAO GIỜ Dùng Cho Khóa)

Các hàm random trong thư viện chuẩn của đa số ngôn ngữ lập trình được thiết kế cho mô phỏng thống kê, không phải mật mã:

  • Python: random.random() (Mersenne Twister — tất định, có thể khôi phục trạng thái từ 624 đầu ra).
  • JavaScript: Math.random() (xorshift128+ trong V8 — có thể dự đoán).
  • C: rand() (linear congruential generator — dự đoán cực dễ).
  • Java: java.util.Random (linear congruential — có thể dự đoán).

Các bộ tạo này có entropy thấp, chu kỳ ngắn và trạng thái dễ đoán. Dùng chúng để tạo khóa cũng như không dùng ngẫu nhiên. Tuyệt đối không tạo khóa riêng tư hoặc cụm từ hạt giống bằng các hàm này.

Những Thất Bại Lịch Sử Của Tính Ngẫu Nhiên

Lỗi Android SecureRandom (2013)

Vào tháng 8 năm 2013, một lỗi nghiêm trọng được phát hiện trong triển khai SecureRandom của Android. Java PRNG không được seed đúng cách trên một số thiết bị Android, khiến nhiều ứng dụng ví Bitcoin tạo khóa riêng tư từ trạng thái có thể dự đoán. Kẻ tấn công đã khai thác điều này để đánh cắp khoảng 55 BTC. Lỗi ảnh hưởng đến việc tạo nonce cho chữ ký ECDSA, dùng cùng một nonce hai lần sẽ cho phép tính khóa riêng tư từ hai chữ ký.

"Blockchain Bandit" (2019)

Nhà nghiên cứu bảo mật Adrian Bednarek phát hiện các ví được tạo với khóa riêng tư cực kỳ yếu, như 1, 2, 3, hoặc các từ điển đơn giản băm một lần. Một kẻ tấn công đã quét có hệ thống tiền từ các địa chỉ này trong nhiều năm, tích lũy hơn 45,000 ETH. Bandit chỉ đơn giản liệt kê các khóa entropy thấp và kiểm tra xem chúng có giữ tiền không.

Các ví dụ khóa đã bị vét:

  • Khóa riêng tư 0x0000000000000000000000000000000000000000000000000000000000000001 (số 1)
  • Khóa riêng tư suy ra từ mật khẩu và cụm từ phổ biến

Lỗ Hổng Milk Sad (2023)

Lệnh seed của công cụ libbitcoin-explorer (bx) dùng Mersenne Twister được seed chỉ với 32 bit thời gian hệ thống. Điều này nghĩa là mọi khóa tạo bằng công cụ này có tối đa 32 bit entropy, khoảng 4.3 tỷ khả năng. Kẻ tấn công đã brute-force các khóa này và đánh cắp tiền.

Lỗi Khóa Yếu Debian OpenSSL (2008)

Một maintainer Debian vô tình xóa một dòng mã cung cấp entropy cho bộ tạo số ngẫu nhiên của OpenSSL. Trong hai năm (2006-2008), mọi khóa mật mã được tạo trên hệ Debian và Ubuntu chỉ có 15 bit entropy từ process ID, tạo tối đa 32,767 khóa duy nhất. Tất cả khóa SSH, chứng chỉ SSL và mọi khóa tiền mã hóa được tạo trong giai đoạn này trên hệ bị ảnh hưởng đều bị xâm phạm.

Bài Học Rút Ra

  1. Không bao giờ tin một nguồn entropy duy nhất nếu chưa xác minh.
  2. Lỗi triển khai nhỏ có thể làm entropy giảm thảm họa.
  3. Kẻ tấn công chủ động khai thác tính ngẫu nhiên yếu, đây không phải lý thuyết.
  4. Mã nguồn mở, được kiểm toán là thiết yếu cho các tác vụ quan trọng về entropy.

Nguồn Entropy Chi Tiết

Entropy Pool Của Hệ Điều Hành

Các hệ điều hành hiện đại duy trì một entropy pool được nạp từ nhiều nguồn:

  • Thời điểm ngắt — Thời điểm ngắt phần cứng (bàn phím, chuột, đĩa, mạng) cung cấp đầu vào khó đoán.
  • Thời điểm I/O đĩa — Thời điểm chính xác của thao tác đọc/ghi đĩa thay đổi do yếu tố cơ học và điện tử.
  • Hardware RNG — CPU hiện đại (Intel RDRAND, AMD) có bộ tạo số ngẫu nhiên trên chip.
  • Entropy lúc khởi động — Một số hệ lưu entropy qua lần khởi động lại (/var/lib/systemd/random-seed trên Linux).

OS trộn các nguồn này vào entropy pool bằng primitive mật mã, rồi dùng pool để seed CSPRNG. Trên kernel Linux hiện đại (5.18+), /dev/urandom sẽ chặn cho đến khi thu thập đủ entropy lúc khởi động, sau đó không chặn nữa.

Entropy Trình Duyệt (crypto.getRandomValues)

Khi bạn dùng công cụ web như trình tạo của SafeSeed, API crypto.getRandomValues() của trình duyệt sẽ được dùng. API này ủy thác cho CSPRNG của hệ điều hành:

  • Chrome: Ủy thác cho CSPRNG của OS (BoringSSL).
  • Firefox: Ủy thác cho CSPRNG của OS (NSS).
  • Safari: Ủy thác cho CSPRNG của OS (CommonCrypto).

Điều này được xem là an toàn cho tạo khóa, miễn là OS bên dưới an toàn. Mối lo chính là chạy trong môi trường mà CSPRNG của OS có thể bị ảnh hưởng (ví dụ máy ảo có nguồn entropy không đủ, hoặc hệ điều hành đã bị xâm nhập).

Entropy Của Ví Phần Cứng

Ví phần cứng dùng bộ tạo số ngẫu nhiên thực trên chip:

  • Ledger (Secure Element ST33): Dùng TRNG của chip ST33, lấy mẫu nhiễu tương tự. Đầu ra đi qua kiểm tra sức khỏe NIST SP 800-90B trước khi dùng.
  • Trezor: Dùng hardware RNG của chip STM32. Trezor cũng hỗ trợ trộn thêm entropy do người dùng cung cấp từ kết quả gieo xúc xắc.
  • Coldcard: Dùng TRNG của secure element ATECC608A cộng với hardware RNG của MCU, trộn cả hai nguồn.

Entropy Từ Gieo Xúc Xắc

Tự gieo xúc xắc là phương pháp tạo entropy minh bạch nhất:

  • Một xúc xắc công bằng sáu mặt tạo ra log2(6) = 2.585 bit entropy mỗi lần gieo.
  • 100 lần gieo tạo khoảng 258.5 bit entropy, đủ cho cụm từ hạt giống 24 từ.
  • Người dùng có thể tự xác minh tính ngẫu nhiên bằng vật lý (xúc xắc chuẩn, gieo công bằng, không thao túng).

Xác minh độ công bằng của xúc xắc:

  • Dùng xúc xắc chính xác cấp casino (cạnh sắc, không bo tròn).
  • Gieo trên bề mặt cứng, phẳng, có chặn.
  • Không "đặt" xúc xắc, hãy để chúng lăn tự do.
  • Ghi lại từng kết quả ngay lập tức và theo thứ tự.
Công cụ SafeSeed

SafeSeed Seed Phrase Generator cho phép bạn nhập entropy riêng (như kết quả gieo xúc xắc) để tạo cụm từ hạt giống BIP-39. Cách này giúp bạn xác minh nguồn ngẫu nhiên trong khi vẫn hưởng lợi từ triển khai BIP-39 chính xác của công cụ. Hãy dùng công cụ ở chế độ offline để bảo mật tối đa, xem hướng dẫn Tạo Khóa Offline của chúng tôi.

Kiểm Tra và Xác Minh Tính Ngẫu Nhiên

Bộ Kiểm Tra Thống Kê NIST

NIST SP 800-22 định nghĩa một bộ kiểm tra thống kê để đánh giá bộ tạo số ngẫu nhiên:

  • Frequency test — Số lượng 0 và 1 có gần bằng nhau không?
  • Block frequency test — Các khối con bit có phân bố gần đều không?
  • Runs test — Chuỗi các bit giống nhau liên tiếp (runs) có độ dài đúng kỳ vọng không?
  • Longest run test — Run dài nhất có nằm trong giới hạn kỳ vọng không?
  • Matrix rank test — Hạng ma trận nhị phân có theo phân bố kỳ vọng không?
  • Spectral test — DFT của chuỗi bit có cho thấy tính chất kỳ vọng không?

Các kiểm tra này có thể phát hiện thiên lệch và mẫu lặp, nhưng không thể chứng minh bộ tạo là an toàn. Chúng chỉ có thể phát hiện lỗi.

Bộ Kiểm Tra Dieharder

Một bộ kiểm tra thống kê toàn diện hơn, gồm các bài kiểm tra Diehard gốc cộng thêm kiểm tra bổ sung. Có sẵn dưới dạng phần mềm mã nguồn mở trên Linux.

Xác Minh Thực Tế Cho Người Dùng

Đa số người dùng không thể chạy bộ kiểm tra NIST. Các bước xác minh thực tế:

  1. Xác minh nguồn — Công cụ có dùng crypto.getRandomValues(), os.urandom() hay hardware RNG không? Kiểm tra mã nguồn.
  2. Kiểm tra tạo chéo — Tạo nhiều cụm từ hạt giống và xác minh mỗi lần đều khác nhau.
  3. Hiển thị entropy — Một số công cụ hiển thị entropy thô, hãy kiểm tra xem có trông ngẫu nhiên không (không có mẫu rõ ràng).
  4. Kiểm toán mã nguồn mở — Công cụ có mã nguồn mở và đã được kiểm toán chưa?

Trộn Nhiều Nguồn Entropy

Thực hành tốt nhất cho việc tạo khóa bảo mật cao là trộn nhiều nguồn entropy:

Final Entropy = Hash(Hardware RNG output || OS CSPRNG output || User dice rolls || Timing data)

Trộn nguồn giúp đảm bảo rằng ngay cả khi một nguồn bị xâm nhập hoặc thiên lệch, đầu ra cuối vẫn an toàn miễn là còn ít nhất một nguồn cung cấp đủ entropy. Đây là cách tiếp cận được dùng bởi các ví phần cứng và công cụ tạo khóa được thiết kế tốt.

Trộn XOR

Một phương pháp trộn đơn giản là XOR: nếu bạn có 256 bit từ nguồn A và 256 bit từ nguồn B:

Mixed = A XOR B

Nếu A hoặc B thực sự ngẫu nhiên, kết quả sẽ thực sự ngẫu nhiên. Nếu cả hai đều thiên lệch nhưng độc lập, kết quả sẽ ít thiên lệch hơn từng nguồn riêng lẻ.

Trộn Hash

Để trộn nguồn có độ dài hoặc chất lượng khác nhau, hãy băm chúng cùng nhau:

Mixed = SHA-256(Source_A || Source_B || Source_C)

Hàm băm hoạt động như bộ trích xuất entropy, tạo đầu ra đồng đều bất kể định dạng đầu vào.

Entropy Trong Thiết Lập Multi-Signature

Ví multi-signature cung cấp một dạng dự phòng entropy: ngay cả khi một khóa được tạo với entropy yếu, kẻ tấn công vẫn phải xâm nhập các khóa còn lại. Một multisig 2-of-3 trong đó mỗi khóa được tạo độc lập sẽ có mức an toàn bằng khóa mạnh nhất, không phải khóa yếu nhất.

Đây là lập luận mạnh mẽ để dùng thiết lập multi-signature cho lưu trữ giá trị cao.

FAQ

Entropy trong tiền mã hóa là gì?

Entropy là thước đo mức độ ngẫu nhiên hoặc không thể dự đoán của dữ liệu dùng để tạo khóa mật mã. Trong tiền mã hóa, độ an toàn của khóa riêng tư và cụm từ hạt giống phụ thuộc hoàn toàn vào entropy đủ lớn. Một khóa 256-bit nên chứa 256 bit ngẫu nhiên thực, nếu entropy thấp hơn thì khóa sẽ có thể bị đoán.

Tôi cần bao nhiêu entropy cho một ví an toàn?

Cụm từ hạt giống BIP-39 12 từ cung cấp 128 bit entropy, và cụm từ 24 từ cung cấp 256 bit. Cả hai đều được xem là an toàn trước tấn công brute-force với công nghệ hiện tại. Với lưu trữ dài hạn giá trị cao, khuyến nghị 256 bit (24 từ) để có biên an toàn tối đa.

Math.random() có an toàn để tạo khóa crypto không?

Tuyệt đối không. Math.random() và các PRNG phi mật mã tương tự (Python random, C rand()) là tất định, dễ dự đoán, và entropy thấp. Chúng không bao giờ được dùng để tạo khóa mật mã. Luôn dùng crypto.getRandomValues() trong trình duyệt, os.urandom() trong Python, hoặc bộ tạo số ngẫu nhiên phần cứng.

Tôi có thể tự tạo entropy bằng cách nghĩ ra các số ngẫu nhiên không?

Không. Con người rất kém trong việc tạo số ngẫu nhiên. Các nghiên cứu liên tục cho thấy các chuỗi "ngẫu nhiên" do con người chọn có entropy thấp hơn nhiều so với vẻ ngoài. Hãy dùng một quá trình vật lý (xúc xắc, hardware RNG) hoặc RNG phần mềm bảo mật mật mã.

Làm sao xác minh bộ tạo số ngẫu nhiên của ví là an toàn?

Kiểm tra mã nguồn của ví (nếu là mã nguồn mở) để xác minh nó dùng CSPRNG hoặc hardware TRNG. Tìm các lời gọi crypto.getRandomValues(), os.urandom(), hoặc API hardware RNG. Với ví phần cứng, kiểm tra tài liệu bảo mật của nhà sản xuất và báo cáo kiểm toán bên thứ ba.

"Blockchain bandit" là gì và nó dạy gì về entropy?

"Blockchain bandit" là kẻ tấn công đã có hệ thống đánh cắp tiền mã hóa từ các ví tạo bằng khóa riêng tư yếu (như số 1, 2, 3, hoặc khóa sinh từ mật khẩu đơn giản). Điều này cho thấy kẻ tấn công chủ động liệt kê các khóa entropy thấp và vét sạch mọi khoản tiền họ tìm thấy. Nó nhấn mạnh tầm quan trọng sống còn của việc dùng bộ tạo số ngẫu nhiên entropy cao.

Bộ tạo số ngẫu nhiên của ví phần cứng có đáng tin không?

TRNG của ví phần cứng nhìn chung là đáng tin, nhưng vẫn là một điểm tin cậy đơn lẻ. Để bảo mật tối đa, bạn có thể trộn đầu ra hardware RNG với entropy do người dùng cung cấp (gieo xúc xắc). Một số ví phần cứng (như Trezor và Coldcard) hỗ trợ trộn này ngay trong hệ thống. Điều này đảm bảo rằng ngay cả khi hardware RNG bị xâm nhập, khóa tạo ra vẫn an toàn.

Hệ điều hành (Linux, macOS, Windows) có ảnh hưởng đến bảo mật khóa không?

Có. Chất lượng và cách triển khai CSPRNG của OS ảnh hưởng đến bảo mật khóa. Các phiên bản hiện đại của Linux, macOS và Windows đều cung cấp bộ tạo số ngẫu nhiên bảo mật mật mã (/dev/urandom, arc4random, BCryptGenRandom). Tuy nhiên, lỗi Debian OpenSSL giai đoạn 2006-2008 đã cho thấy lỗ hổng cấp OS có thể làm entropy giảm thảm họa. Hãy luôn cập nhật OS và dùng phần mềm được kiểm toán kỹ.

Hướng Dẫn Liên Quan