Cách sử dụng
- Đặt Độ dài và chọn Đơn vị: Byte dữ liệu ngẫu nhiên hoặc số Ký tự Base64. Khi cần tạo khóa, hãy tính theo byte: 32 byte là một khóa 256 bit.
- Đặt Số lượng chuỗi cần tạo và Dấu phân cách giữa chúng: Xuống dòng, Dấu phẩy hoặc Dấu cách.
- Chọn Biến thể Tiêu chuẩn hoặc An toàn cho URL. Với đơn vị byte, bạn cũng có thể tắt Phần đệm nếu hệ thống đích không cần dấu =.
- Nhấp Tạo để có các giá trị mới, rồi nhấp Sao chép tất cả hoặc Tải xuống để lưu danh sách.
Byte, ký tự và entropy
Độ mạnh của một chuỗi ngẫu nhiên được đo bằng số bit entropy. Mỗi byte ngẫu nhiên đóng góp 8 bit, nên 16 byte cho 128 bit và 32 byte cho 256 bit. Base64 chỉ thay đổi cách viết các byte đó: mỗi ký tự mang 6 bit, và cứ 3 byte trở thành 4 ký tự. Công cụ hiển thị entropy của mỗi chuỗi để bạn kiểm tra nhanh.
Với đơn vị byte, đầu ra khi giải mã cho đúng chừng ấy byte ngẫu nhiên, đây chính là điều mà khóa và khóa bí mật cần. Với đơn vị ký tự, bạn nhận được chính xác số ký tự đã đặt, mỗi ký tự được chọn ngẫu nhiên với xác suất đều nhau từ bảng 64 ký tự; hãy dùng đơn vị này khi hệ thống yêu cầu token có độ dài cố định và lưu nó dưới dạng văn bản.
| Byte | Ký tự Base64 | Entropy | Mục đích thường gặp |
|---|---|---|---|
| 12 | 16 | 96 bit | Nonce (IV) cho AES-GCM |
| 16 | 24 (22 nếu không có phần đệm) | 128 bit | Salt, token phiên và token CSRF, khóa AES-128 |
| 32 | 44 (43 nếu không có phần đệm) | 256 bit | Khóa AES-256 và HMAC-SHA256, khóa bí mật HS256, khóa API |
| 64 | 88 (86 nếu không có phần đệm) | 512 bit | Khóa HMAC-SHA512, khóa bí mật HS512 |
Giá trị Base64 ngẫu nhiên được dùng ở đâu
- Khóa bí mật JWT. RFC 7518 yêu cầu khóa HMAC dài ít nhất bằng đầu ra của hàm băm: 32 byte cho HS256, 48 byte cho HS384 và 64 byte cho HS512. Một số thư viện dùng nguyên chuỗi bí mật, số khác lại giải mã Base64 trước, vì vậy hãy kiểm tra xem thư viện của bạn cần dạng nào. Công cụ giải mã JWT xác minh chữ ký từ HS256 đến HS512 với cả hai dạng khóa bí mật, còn công cụ tạo HMAC nhận khóa ở dạng văn bản, hex hoặc Base64.
- Khóa ứng dụng. Chẳng hạn, Laravel lưu khóa mã hóa 32 byte trong tệp
.envdưới dạngAPP_KEY=base64:..., đúng định dạng của một chuỗi 32 byte do công cụ này tạo ra. - Kubernetes Secret. Giá trị trong
dataphải là Base64 tiêu chuẩn có phần đệm. Chuỗi được tạo theo đơn vị byte, với Biến thể Tiêu chuẩn và Phần đệm được bật, có thể đặt thẳng vào đó, và Pod sẽ nhận được các byte ngẫu nhiên thô. Nếu ứng dụng cần chính văn bản Base64, hãy đặt nó trongstringData. - Token trong URL. Liên kết đặt lại mật khẩu, mã mời và các token khác được truyền qua URL nên dùng biến thể an toàn cho URL, vốn thay
+và/bằng-và_. Xem chi tiết tại Base64URL.
Vì sao dùng crypto.getRandomValues thay vì Math.random
Math.random() là bộ sinh số ngẫu nhiên đa dụng và nhanh. Đầu ra của nó không được thiết kế để khó đoán, và với một số engine JavaScript, trạng thái bên trong có thể được khôi phục chỉ từ vài giá trị. Công cụ này dùng crypto.getRandomValues(), bộ sinh số ngẫu nhiên an toàn về mặt mật mã được hệ điều hành cung cấp hạt giống (seed), cùng loại nguồn ngẫu nhiên với openssl rand và mô-đun secrets của Python. Các giá trị được tạo trên thiết bị của bạn và không bao giờ được gửi đi hay lưu trữ.
Tạo Base64 ngẫu nhiên bằng mã
# Shell: 32 byte ngẫu nhiên dạng Base64 (44 ký tự)
openssl rand -base64 32
head -c 32 /dev/urandom | base64
# Python
import base64, secrets
base64.b64encode(secrets.token_bytes(32)).decode()
secrets.token_urlsafe(32) # an toàn cho URL, không phần đệm, 43 ký tự
// Node.js
const crypto = require('crypto');
crypto.randomBytes(32).toString('base64');
crypto.randomBytes(32).toString('base64url'); // an toàn cho URL, không phần đệm
// Trình duyệt
const bytes = crypto.getRandomValues(new Uint8Array(32));
btoa(String.fromCharCode(...bytes));
Câu hỏi thường gặp
Khóa hay chuỗi bí mật ngẫu nhiên nên dài bao nhiêu?
16 byte (128 bit) là đủ cho những giá trị chỉ cần là duy nhất và không thể đoán được, như ID phiên, token CSRF và salt. Hãy dùng 32 byte (256 bit) cho khóa AES-256, khóa HMAC-SHA256 và khóa bí mật HS256, và 64 byte cho HMAC-SHA512 và HS512.
Kết quả có giống openssl rand -base64 32 không?
= và giải mã thành 32 byte ngẫu nhiên. Tất nhiên, bản thân các giá trị lần nào cũng khác nhau.Nên dùng đơn vị byte hay ký tự?
Dùng byte khi chuỗi sẽ được giải mã, như với khóa mã hóa và Kubernetes Secret. Dùng ký tự khi hệ thống cần token có độ dài chính xác và dùng nguyên văn bản đó. Chuỗi tạo theo đơn vị ký tự chỉ chắc chắn giải mã được trọn vẹn khi độ dài của nó là bội số của 4.
Khi nào cần biến thể an toàn cho URL?
/ chia tách đường dẫn URL, còn + biến thành dấu cách trong chuỗi truy vấn được mã hóa theo kiểu biểu mẫu. Base64 an toàn cho URL dùng - và _ thay thế và thường được viết không có phần đệm.Các giá trị được tạo có bị lưu trữ hoặc gửi đi đâu không?
Không. Chúng được tạo bằng JavaScript trong trình duyệt của bạn, không bao giờ được truyền đi và sẽ biến mất khi bạn rời trang. Khi đã dùng một giá trị làm khóa bí mật thật, hãy lưu nó trong trình quản lý mật khẩu hoặc kho lưu trữ bí mật thay vì trong tin nhắn trò chuyện hay ticket.