Bài viết
Mã hóa và giải mã dữ liệu một cách riêng tư
Mỗi ngày các lập trình viên dán token, payload và thông tin đăng nhập vào các trang mã hóa và giải mã. Những trang tiện lợi nhất chạy trên máy chủ, nghĩa là dữ liệu của bạn rời khỏi máy cho một tác vụ vốn không bao giờ cần điều đó. Bốn công cụ này chạy hoàn toàn trong trình duyệt, nên dữ liệu ở lại với bạn.
Base64: trông lộn xộn nhưng không bí mật
Base64 là một dạng mã hóa biểu diễn, không phải mã hóa bảo mật. Nó biến dữ liệu nhị phân thành văn bản có thể chịu được thao tác sao chép dán hoặc đi qua các hệ thống chỉ xử lý ký tự đơn giản. Bất kỳ ai thấy chuỗi Base64 đều có thể giải nó về bản gốc trong một bước, nên một chuỗi chứa khóa API, chứng chỉ riêng tư hay nội dung email hoàn toàn đọc được với người đang nắm giữ. Rủi ro là giá trị đó thường ẩn trong tệp cấu hình, data URL hoặc tiêu đề xác thực và trông khó hiểu, khiến người ta muốn dán vào công cụ giải mã đầu tiên tìm thấy trên mạng. Công cụ đó nhận lấy bí mật ở dạng thô. Một công cụ giải mã Base64 cục bộ cho bạn thấy các byte gốc mà giá trị không bao giờ đến máy chủ.

Mã hóa URL: chuỗi truy vấn mang nhiều hơn bạn nghĩ
Mã hóa phần trăm cho phép bạn đặt khoảng trắng, dấu và ký tự dành riêng vào một URL một cách an toàn. Văn bản bạn mã hóa hay giải mã thường là một chuỗi truy vấn thực từ một ứng dụng, và chúng mang định danh phiên, từ khóa tìm kiếm, địa chỉ email, đích chuyển hướng và đôi khi tham số có chữ ký. Dán một URL đầy đủ vào trình mã hóa từ xa sẽ trao tất cả những thứ đó cho bên thứ ba cùng một lúc, và chuỗi truy vấn chính là loại giá trị thường rơi vào nhật ký máy chủ. Mã hóa và giải mã trong trình duyệt nghĩa là URL được xử lý trong bộ nhớ trên chính thiết bị của bạn và không bao giờ được truyền đi trong khi bạn làm việc với nó.
JWT: payload được ký, không phải bị giấu
Một JSON Web Token gồm ba phần Base64url nối với nhau bằng dấu chấm: một tiêu đề, một payload và một chữ ký. Chữ ký chứng minh token không bị sửa đổi, nhưng hoàn toàn không che giấu payload, vốn giải mã ra JSON đọc được chứa định danh người dùng, vai trò, thời điểm hết hạn và mọi claim tùy chỉnh mà bên phát hành thêm vào. Một token hợp lệ cũng là một thông tin đăng nhập sống: cho đến khi hết hạn, bất kỳ ai giữ nó đều có thể hành động thay người dùng. Dán một token đang hoạt động vào trình giải mã trực tuyến sẽ gửi một thông tin đăng nhập đang hiệu lực tới máy chủ mà bạn không kiểm soát. Một trình giải mã phân tích token trong trình duyệt của bạn cho thấy cùng tiêu đề và payload mà token đó không bao giờ rời khỏi trang.

Băm: đầu vào quan trọng hơn bản tóm tắt
Một hàm băm biến mọi đầu vào thành một bản tóm tắt có độ dài cố định, và bạn không thể đảo ngược bản tóm tắt về lại đầu vào. Tính chất này khiến băm hữu ích để kiểm tra tính toàn vẹn của tệp hoặc so sánh các giá trị mà không lưu bản gốc. Cái bẫy nằm ở phía đầu vào: để tính băm của một mật khẩu, một tài liệu hay một bí mật cấu hình, bạn phải đưa giá trị thực cho công cụ. Nếu công cụ đó chạy trên máy chủ, đầu vào nhạy cảm sẽ đi tới đó dù chỉ bản tóm tắt vô hại được trả về. Tính băm cục bộ giữ đầu vào trên thiết bị của bạn, nên bạn có được bản tóm tắt cần thiết mà không để lộ thứ bạn đang băm.
Mã hóa Base64: ánh xạ byte và đệm
Base64 dịch các byte 8-bit thành ký tự 6-bit bằng cách nhóm ba byte đầu vào (24 bit) thành bốn giá trị 6-bit. Mỗi giá trị 6-bit ánh xạ đến một ký tự trong bảng chữ cái Base64 (A-Z, a-z, 0-9, +, /). Vì quá trình này yêu cầu đầu vào chia hết cho 24 bit, các đầu vào ngắn được đệm: một byte còn lại tạo ra hai ký tự đệm (==), hai byte còn lại tạo ra một (=). Biến thể Base64url, được dùng trong JSON Web Tokens (JWTs), thay thế + bằng - và / bằng _ để tạo chuỗi an toàn URL, và bỏ hoàn toàn phần đệm =, vì các ký tự đệm có thể gây lỗi trong bộ phân tích URI nghiêm ngặt. Nhận ra sự khác biệt này quan trọng khi gỡ lỗi xử lý token: JWT có vẻ bị lỗi định dạng có thể đơn giản chỉ là được mã hóa Base64url thay vì Base64 tiêu chuẩn.
Chữ ký JWT: HS256, RS256 và nhầm lẫn thuật toán
Bảo mật của JSON Web Token phụ thuộc hoàn toàn vào chữ ký của nó, phân đoạn thứ ba được phân tách bằng dấu chấm. Với HS256 (HMAC-SHA256), máy chủ ký header và payload được mã hóa Base64url bằng khóa bí mật. Hàm băm SHA-256 cung cấp khả năng chống va chạm: về mặt tính toán không thể tạo ra payload đã sửa đổi băm ra cùng chữ ký mà không biết khóa bí mật. Với RS256, máy chủ ký bằng khóa riêng RSA và xác minh bằng khóa công khai. Một lỗ hổng đã biết gọi là nhầm lẫn thuật toán xảy ra khi thư viện máy chủ không thực thi nghiêm ngặt loại thuật toán mong đợi. Kẻ tấn công có thể thay đổi trường alg trong header token từ RS256 thành HS256 và ký token bằng khóa công khai của máy chủ làm HMAC secret, vì khóa công khai thường có thể truy cập. Giải mã header JWT cục bộ trong trình duyệt cho phép bạn xác minh thuật toán nào thực sự được chỉ định, mà không để lộ token đang hoạt động cho các hệ thống ghi nhật ký của bên thứ ba.
Công cụ trong bài viết này
- Mã hóa / Giải mã Base64Mã hóa hoặc giải mã Base64, văn bản và tệp. Không tải lên, 100% cục bộ.
- Mã hóa / Giải mã URLMã hóa hoặc giải mã phần trăm chuỗi URL. Không tải lên, 100% cục bộ.
- Giải mã JWTGiải mã JWT (header, payload, hạn dùng) mà không gửi đi đâu. Không xác minh chữ ký.
- Trình tạo HashTạo hash MD5, SHA-1, SHA-256, SHA-512 từ văn bản hoặc tệp. Không tải lên.
Câu hỏi thường gặp
Base64 hay mã hóa URL có phải là một dạng bảo mật không?
Không. Cả hai đều là dạng mã hóa biểu diễn có thể đảo ngược, được thiết kế để truyền dữ liệu an toàn chứ không phải để bảo vệ nó. Bất kỳ ai đọc được chuỗi đã mã hóa đều giải nó tức thì, không cần khóa hay mật khẩu. Nếu cần giữ kín một giá trị, hãy mã hóa bảo mật nó bằng một thuật toán phù hợp và quản lý khóa riêng. Hãy xem mọi giá trị Base64 hay mã hóa phần trăm như thể nó được viết bằng văn bản thuần.
Tại sao việc tôi giải mã token hay băm mật khẩu ở đâu lại quan trọng?
Bởi vì đầu vào mới là phần nhạy cảm. Một JWT hợp lệ là một thông tin đăng nhập sống, và mật khẩu bạn băm là bí mật thực sự. Một công cụ chạy trên máy chủ nhận đầu vào thô đó trước cả khi trả về kết quả, nghĩa là một bản sao có thể bị ghi nhật ký hoặc lưu giữ ở nơi bạn không thấy. Một công cụ chạy trong trình duyệt thực hiện cùng thao tác trong bộ nhớ trên chính máy của bạn, nên token hay mật khẩu không bao giờ được gửi đi đâu cả.