Chuyển đến nội dung chính
Change page

Xác thực trên Ethereum

Nếu bạn đến từ lĩnh vực phát triển web truyền thống, bạn đã quen với việc đăng nhập bằng tên người dùng/mật khẩu, các luồng OAuth và cookie phiên. Việc xác thực trên Ethereum hoạt động theo một cách khác—và ở nhiều khía cạnh, đơn giản hơn.

Trên Ethereum, người dùng chứng minh danh tính của họ bằng việc ký một thông điệp bằng ví của họ. Không có mật khẩu nào cần lưu trữ. Không có cơ sở dữ liệu thông tin xác thực nào để rò rỉ. Chỉ có mật mã học.

Nó khác với Web2 như thế nào?

Web2Ethereum
Tên người dùng + mật khẩuĐịa chỉ ví + chữ ký
Máy chủ lưu trữ thông tin xác thựcNgười dùng giữ khóa riêng tư
Phiên được quản lý bằng cookie / JWTPhiên bắt đầu bằng chữ ký ví ngoài chuỗi
"Đăng nhập bằng Google""Đăng nhập bằng Ethereum"
Các luồng đặt lại mật khẩuKhôi phục bằng cụm từ hạt giống

Sự thay đổi cơ bản: trong Web2, một máy chủ tập trung xác thực bạn. Trên Ethereum, bạn tự xác thực chính mình bằng cách chứng minh bạn kiểm soát một địa chỉ cụ thể—và bất kỳ ai cũng có thể xác minh điều đó một cách độc lập.

Điều kiện tiên quyết

Đảm bảo bạn hiểu rõ:

Cách thức hoạt động của xác thực dựa trên ví

Luồng cốt lõi rất đơn giản:

  1. Ứng dụng phi tập trung (dapp) của bạn yêu cầu người dùng kết nối ví của họ (thông qua MetaMask, Rainbow, WalletConnect, v.v.)
  2. Ví chia sẻ địa chỉ Ethereum của người dùng - đây là định danh công khai của họ
  3. Dapp của bạn tạo ra một thông điệp duy nhất (một nonce hoặc thử thách)
  4. Người dùng ký thông điệp bằng khóa riêng tư của họ (diễn ra bên trong ví)
  5. Backend của bạn xác minh chữ ký so với địa chỉ được yêu cầu
  6. Nếu hợp lệ, người dùng được xác thực

Không có mật khẩu nào từng được nhập, lưu trữ hoặc truyền đi.

Đăng nhập bằng Ethereum (EIP-4361)

EIP-4361 (mở trong tab mới) định nghĩa một định dạng thông điệp tiêu chuẩn cho việc đăng nhập Ethereum, thường được gọi là SIWE (Sign-In with Ethereum). Nó thay thế việc ký thông điệp đặc tả (ad-hoc) bằng một tiêu chuẩn có cấu trúc và an toàn.

Một thông điệp SIWE trông như thế này:

Các tính năng chính của SIWE:

  • Ràng buộc tên miền (Domain binding) - thông điệp bao gồm tên miền, giúp ngăn chặn lừa đảo (phishing)
  • ID Chuỗi (Chain ID) - chỉ định mạng lưới nào mà chữ ký có hiệu lực
  • Nonce - ngăn chặn các cuộc tấn công phát lại (replay attacks)
  • Hết hạn (Expiration) - dấu thời gian tùy chọn giới hạn khoảng thời gian có hiệu lực
  • Tài nguyên (Resources) - các URI tùy chọn cho quyền truy cập theo phạm vi

Các thư viện SIWE

Ví dụ: đăng nhập phía máy khách (client-side) với siwe

Ví dụ: xác minh phía máy chủ (server-side) (Node.js)

Các thư viện kết nối ví

Trước khi xác thực, bạn cần người dùng kết nối ví của họ. Các thư viện này giúp việc đó trở nên dễ dàng:

Xác minh chữ ký theo cách thủ công

Nếu bạn không muốn sử dụng SIWE, bạn có thể xác minh chữ ký trực tiếp:

Các lưu ý bảo mật quan trọng

  • Luôn sử dụng một nonce - ngăn chặn các cuộc tấn công phát lại nơi một chữ ký cũ bị sử dụng lại
  • Bao gồm tên miền - ngăn chặn chữ ký có hiệu lực trên các trang web khác nhau
  • Kiểm tra thời gian hết hạn - chữ ký nên có một khoảng thời gian hiệu lực giới hạn
  • Sử dụng SIWE (EIP-4361) khi có thể - nó xử lý tất cả những điều trên cho bạn
  • Không bao giờ để lộ khóa riêng tư - việc ký diễn ra bên trong ví; ứng dụng của bạn chỉ nhìn thấy kết quả

Quản lý phiên

Sau khi được xác thực, bạn vẫn cần các phiên—giống như Web2. Các mẫu phổ biến:

  • Token JWT - cấp phát một JWT sau khi xác minh chữ ký, sử dụng cho các yêu cầu API
  • Phiên phía máy chủ (Server-side sessions) - lưu trữ địa chỉ đã được xác minh trong một cookie phiên
  • SIWE với tài nguyên - định nghĩa các token truy cập theo phạm vi được liên kết với các URI cụ thể

Điểm khác biệt chính so với Web2: địa chỉ Ethereum của người dùng là danh tính lâu dài của họ. Họ có thể sử dụng nó trên bất kỳ dapp nào mà không cần tạo tài khoản mới.

Danh tính phi tập trung

Xác thực Ethereum là một phần của phong trào rộng lớn hơn hướng tới danh tính tự chủ (self-sovereign identity). Các tiêu chuẩn và dự án trong không gian này bao gồm:

Đọc thêm