Thêm vào Chrome

Cách hoạt động

Tổng quan kỹ thuật dành cho người rà soát bảo mật. Mọi điều ở đây đều đối chiếu được với mã nguồn — kể cả những phần không có lợi cho chúng tôi, chúng tôi nói ra thay vì bỏ qua.

Kiến trúc

Không có backend. Tiện ích là một tiện ích Chrome theo Manifest V3, sinh mã TOTP/HOTP ngay trên máy bằng OTPAuth. Chúng tôi không vận hành máy chủ, không giữ tài khoản, và không có kênh nào để dữ liệu người dùng đến được tay chúng tôi.

Vì không có máy chủ nên cũng không có vật liệu khóa phía máy chủ, không ký gửi khóa và không có đường khôi phục nào do chúng tôi kiểm soát. Nếu người dùng quên mật khẩu và mất mã khôi phục, chúng tôi không giúp được — đó là chủ ý thiết kế.

Mật mã

Bảo vệ bằng mật khẩu là tùy chọn và mặc định tắt. Khi bật:

Thuật toán mã hóa
AES-256-GCM, IV ngẫu nhiên 96 bit cho mỗi bản ghi và mỗi lần ghi lại
Dẫn xuất khóa
PBKDF2-HMAC-SHA256, 600.000 vòng lặp, muối ngẫu nhiên 128 bit (theo khuyến nghị OWASP)
Khóa chính
256 bit, từ crypto.getRandomValues, sinh một lần duy nhất; mật khẩu chỉ bọc lấy nó
Dấu vân tay
HMAC-SHA256 dưới một khóa con dẫn xuất bằng HKDF, dùng để hợp nhất bản ghi giữa các thiết bị
Nơi giữ khóa đã mở
chrome.storage.session — chỉ trong bộ nhớ, không bao giờ ghi xuống đĩa, xóa khi đóng trình duyệt, content script không chạm tới được
Tự động khóa
Mỗi lần mở / sau 5, 15 hoặc 60 phút không dùng / cho đến khi đóng trình duyệt
Cách hiện thực
Chỉ dùng WebCrypto. Không tự viết bất kỳ nguyên hàm mật mã nào và không đóng gói thư viện mật mã nào.

Vì sao khóa có hai tầng

Dữ liệu không bao giờ được mã hóa trực tiếp bằng khóa dẫn xuất từ mật khẩu. Một khóa chính ngẫu nhiên mã hóa các bản ghi; đầu ra PBKDF2 chỉ bọc lấy khóa chính đó. Hai hệ quả kéo theo, và cả hai đều quan trọng:

  • Đổi mật khẩu chỉ ghi lại 32 byte thay vì mã hóa lại từng bản ghi, từng bản sao lưu và từng tệp xuất. Chính những lần ghi lại hàng loạt như vậy là lúc hệ thống lưu trữ đánh mất dữ liệu.
  • Mã khôi phục 160 bit có thể bọc cùng khóa chính một cách độc lập, nên quên mật khẩu vẫn cứu được. Mã chỉ hiện một lần, phải nhập lại để xác nhận và được đổi mới sau mỗi lần dùng. Không có gì được ghi xuống đĩa cho đến khi người dùng xác nhận.

Cái gì được mã hóa, cái gì không

Khi bật bảo vệ bằng mật khẩu, toàn bộ bản ghi tài khoản được mã hóa trừ mã định danh và dấu vân tay — kể cả tên dịch vụ, nên hồ sơ trình duyệt bị đánh cắp cũng không lộ ra người dùng có tài khoản ở những dịch vụ nào. Khi bật, tiện ích mã hóa các bản ghi, kiểm chứng bằng cách giải mã và đối chiếu, rồi mới xóa mọi bản sao dạng rõ: bộ nhớ cục bộ của trình duyệt, phần đồng bộ và cả bảy ảnh chụp sao lưu luân phiên.

Nói thẳng, vì điều này ảnh hưởng đến đánh giá của bạn:

  • Khi tắt bảo vệ bằng mật khẩu, các tài khoản được lưu không mã hóa và, nếu Chrome Sync đang bật, được nhân bản qua chính tài khoản Google của người dùng. Chúng không bao giờ đến chỗ chúng tôi, nhưng Google thì giữ. Có thể tắt đồng bộ, và thao tác đó cũng xóa những gì đã nằm sẵn ở đó.
  • Lịch sử sử dụng theo từng trang — tài khoản nào dùng trên tên miền nào — được lưu cục bộ và không nằm trong phạm vi két trong lúc đang được thu thập. Bật bảo vệ bằng mật khẩu sẽ xóa nó; cũng có thể tắt riêng phần này.

Mô hình mối đe dọa

Bảo vệ trước

  • Thư mục hồ sơ trình duyệt bị đánh cắp hoặc sao chép
  • Mã độc infostealer hút toàn bộ dữ liệu trình duyệt
  • Người có quyền tiếp cận vật lý một máy bỏ không
  • Bản ghi tài khoản đi tới Google qua Chrome Sync
  • Tệp sao lưu bị mất hoặc bị lấy cắp (bản xuất có mật khẩu)

Không bảo vệ trước

  • Mã độc chạy dưới quyền người dùng trong lúc két đang mở
  • Keylogger ghi lại mật khẩu ngay khi gõ
  • Trình duyệt hoặc hệ điều hành đã bị xâm nhập
  • Việc chính các dịch vụ bên thứ ba dùng mã đó bị xâm nhập

Ngắn gọn: nó bảo vệ dữ liệu khi lưu trữ. Nó không, và không thể, bảo vệ một thiết bị đã nằm trong tay kẻ tấn công ngay trong lúc sử dụng.

Quyền

Tệp manifest khai báo đúng hai quyền và không có quyền host nào:

storage
Tài khoản và thiết lập trong bộ nhớ cục bộ, khóa đã mở trong bộ nhớ phiên, cùng bản sao đồng bộ tùy chọn
activeTab
Đọc tên miền của tab đang mở để làm nổi bật tài khoản tương ứng, và chụp tab khi người dùng quét mã QR từ màn hình

Không có content script nào, không có quyền tabs, cookies hay webRequest, và không có tài nguyên nào truy cập được từ web. Tiện ích không thể đọc hay sửa nội dung của bất kỳ trang nào.

Máy ảnh

Quét QR bằng máy ảnh chạy trên một trang của tiện ích mở trong tab, không phải trong cửa sổ popup — popup bị hủy ngay khi mất tiêu điểm, mà hộp thoại xin quyền thì làm đúng điều đó. Việc này không cần bất kỳ quyền nào trong manifest: nó dùng hộp thoại xin quyền máy ảnh chuẩn của trình duyệt, cấp theo origin của tiện ích và thu hồi được trong cài đặt trang, và chỉ xuất hiện khi người dùng mở trình quét. Video được giải mã ngay trên máy, không bao giờ được truyền đi hay lưu lại.

Lưu lượng ra ngoài

Khi dùng bình thường, tiện ích không gửi yêu cầu tự động nào, và Manifest V3 cấm mã từ xa. Toàn bộ kết nối nó có thể tạo ra:

Máy chủKhi nàoCó mang dữ liệu người dùng không?
worldtimeapi.org
timeapi.io
Kiểm tra lệch đồng hồ, có cache, lỗi thì bỏ qua lặng lẽ. Đồng hồ lệch là TOTP hỏng.Không
authenticator.shTrang chào mừng khi cài đặt; trang góp ý khi gỡ cài đặt hoặc đánh giá.Không (chỉ log máy chủ web thông thường)

Không phông chữ, mã, kiểu dáng hay hình ảnh nào được tải từ máy chủ bên thứ ba. Mọi thứ cần để dựng giao diện đều nằm sẵn trong gói cài đặt.

Xác minh những gì chúng tôi phát hành

Bạn không cần tin suông bất cứ điều nào ở trên. Tiện ích là mã nguồn mở và mỗi bản phát hành đều tái lập được:

  1. Tải tệp .crx đã phát hành từ Chrome Web Store và giải nén
  2. Chuyển sang đúng thẻ git tương ứng
  3. Chạy npm ci && npm run build trên Node 20 LTS
  4. So sánh thư mục dist/ thu được với gói đã giải nén

Mỗi bản phát hành trên GitHub đều kèm SHA-256 của từng tệp trong dist/ đã dựng, dưới dạng SHA256SUMS-v<version>.txt và theo định dạng sha256sum, nên bước 4 rút lại thành một lần chạy sha256sum -c. Khác biệt chỉ nên nằm ở thứ tự tệp bên trong kho nén và khoảng trắng trong đầu ra đã rút gọn giữa các bản vá Node.

Phụ thuộc lúc chạy được giữ ít một cách có chủ đích — OTPAuth, React, jsQR, Zustand, Framer Motion và Lucide — ghim bằng lockfile đã commit. SBOM theo chuẩn CycloneDX có sẵn khi được yêu cầu.

Xem mã nguồn

Những thứ chúng tôi không có

Chúng tôi là một nhà cung cấp nhỏ và độc lập. Nếu bất kỳ điểm nào dưới đây là yêu cầu bắt buộc trong quy trình của bạn, biết ngay bây giờ vẫn hơn là biết sau ba tuần đánh giá:

  • Không có chứng nhận SOC 2, ISO 27001 hay tương đương
  • Đến nay chưa đặt hàng kiểm thử xâm nhập từ bên thứ ba
  • Không có chương trình bug bounty trả thưởng

Thứ chúng tôi đưa ra để bù lại là mã nguồn minh bạch hoàn toàn, bản dựng xác minh được, bề mặt quyền tối thiểu và không có hạ tầng máy chủ nào có thể giữ dữ liệu của bạn ngay từ đầu.

Liên hệ với chúng tôi

Báo cáo lỗ hổng và câu hỏi bảo mật: security@authenticator.sh. Chính sách công bố, phạm vi, thời gian phản hồi và điều khoản safe harbour nằm ở trang chính sách bảo mật; những gì được lưu và những gì rời khỏi thiết bị được nêu trong chính sách quyền riêng tư.

Chúng tôi sẵn lòng trả lời bảng câu hỏi đánh giá nhà cung cấp bằng văn bản hoặc cùng đội bảo mật của bạn rà từng phần mã nguồn.

Với mọi việc không thuộc phạm vi bảo mật — cài đặt, khôi phục tài khoản, thắc mắc thanh toán khi triển khai — xem hỗ trợ. Xin đừng gửi báo cáo lỗ hổng tới đó; hộp thư ấy không được xử lý như thư mật.