Tiện Ích Crypto & Định Danh Cho Dev
Tám công cụ crypto/định danh nhỏ mà dev hay cần dùng — cặp khoá RSA, khoá JWK/JWKS, mã TOTP, cụm từ ghi nhớ demo, chữ ký HMAC, chữ ký webhook, cặp PKCE và ULID — gộp chung một trang.
Các bước
- Chọn tab: Cặp khoá RSA, JWK / JWKS, TOTP, Cụm từ ghi nhớ, HMAC, Webhook, PKCE, hoặc ULID.
- Cặp khoá RSA: chọn 2048 hay 4096-bit, bấm Tạo, copy khoá riêng/khoá công khai dạng PEM.
- JWK / JWKS có ba chế độ:
- Tạo khoá: chọn thuật toán — RS256, PS256, ES256, ES384, hoặc EdDSA nếu trình duyệt hỗ trợ Ed25519 — và với RSA thì chọn Độ dài khoá (2048, 3072 hoặc 4096). Kết quả gồm JWK khoá riêng, JWK khoá công khai và JWKS sẵn sàng công khai;
kidlà thumbprint RFC 7638 của khoá công khai. - PEM ↔ JWK: dán khoá PEM (SPKI
PUBLIC KEY, PKCS#8PRIVATE KEY, hoặc dạng cũRSA PRIVATE KEY/EC PRIVATE KEY) rồi bấm Chuyển đổi để lấy JWK, hoặc làm ngược lại từ JWK/JWKS sang PEM. - Thumbprint: dán một JWK hoặc cả JWKS để xem thumbprint SHA-256 của từng khoá, đoạn JSON chính xác đã được hash, và
kidcó trùng thumbprint hay không.
- Tạo khoá: chọn thuật toán — RS256, PS256, ES256, ES384, hoặc EdDSA nếu trình duyệt hỗ trợ Ed25519 — và với RSA thì chọn Độ dài khoá (2048, 3072 hoặc 4096). Kết quả gồm JWK khoá riêng, JWK khoá công khai và JWKS sẵn sàng công khai;
- TOTP: bấm Tạo secret mới để lấy secret base32 mới và xem mã 6 số tự đổi theo thời gian thực; hoặc dán secret cùng mã có sẵn vào mục Kiểm tra mã để kiểm tra.
- Cụm từ ghi nhớ: chọn 12 hay 24 từ, bấm Tạo — đọc cảnh báo bên dưới trước khi dùng vào bất kỳ việc gì.
- HMAC: nhập nội dung và khoá bí mật, chọn thuật toán hash (SHA-256, SHA-384, SHA-512 hoặc SHA-1), có ngay mã hex.
- Webhook: chọn GitHub, Stripe hoặc Slack, rồi chọn Tạo chữ ký hoặc Kiểm tra. Nhập Khoá ký (signing secret) và Body gốc của request; Stripe và Slack cần thêm Timestamp (giây Unix) — ô này được điền sẵn, bấm Bây giờ để lấy lại giờ hiện tại. Chế độ tạo chữ ký hiện đúng các header cần gửi; chế độ kiểm tra nhận Header chữ ký bạn nhận được và cho biết có khớp hay không.
- PKCE: đặt Độ dài (43–128) rồi bấm Tạo để có
code_verifiervàcode_challengeS256 tương ứng. Kiểm tra một cặp so verifier với challenge, còn Ví dụ request xác thực (authorization) tạo URL xác thực được mã hoá đúng cùng body của request lấy token. - ULID: bấm Tạo — mỗi mã mới được thêm lên đầu danh sách.
Mẹo
- Mọi thứ chạy hoàn toàn trong trình duyệt qua Web Crypto API — không có gì bạn nhập được tải lên, và khoá không bao giờ rời khỏi trang.
- Mã TOTP ở đây dùng SHA-1, giống hệt Google Authenticator và mọi app xác thực chuẩn (RFC 6238) — điều này đúng chuẩn dù SHA-1 vốn được coi là yếu cho các mục đích khác.
- Khoá riêng (private key) tạo ở tab Cặp khoá RSA hay JWK / JWKS không rời khỏi tab này — copy lưu lại chỗ an toàn ngay, vì tải lại trang là mất. Chỉ công khai JWKS.
- Thumbprint của JWK bỏ qua
kid,use,algvà các thành phần bí mật, nên khoá riêng và nửa công khai của nó có cùng thumbprint — tiện để đối chiếu khoá ký với mục tương ứng trong JWKS. - PKCE: luôn dùng S256.
plainchỉ dành cho server không hash được, và nó đặt thẳng verifier vào URL xác thực. Verifier được gửi sau, trong request lấy token — không bao giờ nằm trong URL trên trình duyệt. - Chữ ký webhook được tính trên đúng từng byte của body. Hãy dán body nguyên văn như lúc nhận — format lại cho đẹp hay serialize lại JSON đều làm chữ ký thay đổi dù dữ liệu vẫn vậy.
- Stripe để timestamp ngay trong header (
t=…,v1=…) nên chế độ kiểm tra tự đọc từ đó. Slack gửi timestamp ở header riêngX-Slack-Request-Timestamp, nên hãy nhập giá trị đó vào ô timestamp. - Chế độ kiểm tra chấp nhận cả header cũ
X-Hub-Signature: sha1=…của GitHub bên cạnhX-Hub-Signature-256: sha256=…. Bạn có thể dán cả dòng header hoặc chỉ phần giá trị.
Câu hỏi thường gặp
Tab Cụm từ ghi nhớ có phải công cụ tạo seed ví crypto thật không?
Không — nó dùng danh sách từ demo nhỏ, không phải danh sách BIP39 chuẩn 2048 từ mà ví thật yêu cầu, và không có checksum. Tuyệt đối đừng dùng để tạo hay khôi phục ví tiền mã hoá thật.
Vì sao TOTP dùng SHA-1 mà HMAC thì không?
Thuật toán TOTP bị cố định theo chuẩn RFC 6238 mà mọi app xác thực đều theo — đổi đi sẽ làm mã không tương thích với app xác thực thật. Tab HMAC là công cụ đa dụng nên mặc định dùng SHA-256 hiện đại và có thêm SHA-384/512. SHA-1 cũng có, xếp cuối, để kiểm thử theo RFC 2202, OAuth 1.0a và các định dạng webhook cũ — HMAC-SHA1 vẫn chưa bị phá, dù bản thân SHA-1 thì đã.
Chữ ký webhook của tôi không khớp — cần kiểm tra gì?
Trước hết, body phải giống từng byte với thứ nhà cung cấp gửi (không format lại, cùng kiểu xuống dòng). Tiếp theo, bạn phải dùng đúng khoá ký của endpoint đó chứ không phải API key. Cuối cùng, với Stripe và Slack, hãy xem timestamp: nó nằm trong chuỗi được ký. Khi kiểm tra thất bại, trang sẽ hiện header đúng để bạn so với header của mình.
Vì sao khoá PEM của tôi không chuyển đổi được?
Web Crypto chỉ nhập được khoá RSA, EC P-256/P-384/P-521 và Ed25519. Khoá riêng đã mã hoá (ENCRYPTED PRIVATE KEY) phải được giải mã trước, CERTIFICATE không phải là khoá (hãy trích khoá công khai của nó), còn khoá RSA lưu với định danh thuật toán RSASSA-PSS thì không nhập được — hãy xuất lại thành khoá rsaEncryption thông thường.