Hôm nay chúng tôi có mặt trên Product Hunt! Để lại bình luận
Authenticator 1.16.0 đã có mặt. Xem có gì mới
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.
Tiện ích là một tiện ích Chrome theo Manifest V3, sinh mã TOTP ngay trên máy bằng OTPAuth. Việc sinh mã, lưu tài khoản và mã hóa chúng không cần đến backend nào, và không có tài khoản người dùng. Chúng tôi vận hành một máy chủ duy nhất, api.authenticator.sh, cho gói miễn phí và Pro — mô tả bên dưới — và nó không bao giờ nhận khóa bí mật, tên tài khoản, tên dịch vụ hay mã nào.
Máy chủ đó không giữ vật liệu khóa cho tài khoản của bất kỳ ai: 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ế.
Bảo vệ bằng mật khẩu là tùy chọn và mặc định tắt. Khi bật:
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:
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:
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.
Manifest khai báo năm quyền và không có quyền host nào:
Không có Không có content script nào, không có quyền tabs, cookies hay webRequest, và không có web-accessible resources. Không có gì của chúng tôi tồn tại trong một trang cho đến khi bạn yêu cầu mã ở đó; thứ chạy lúc ấy được chèn cho đúng thẻ đó và đúng lần gọi đó, theo quyền mà chính cú nhấp của bạn cấp, và không để lại gì.
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.
Từ phiên bản 1.14.0, tiện ích liên lạc với api.authenticator.sh mỗi ngày một lần — khi trình duyệt khởi động, hoặc sau khi popup đã hiển thị xong, không bao giờ chen vào quá trình hiển thị mã. Yêu cầu gồm một danh sách trường khép kín, được dựng trong đúng một hàm ở src/billing/sync.ts và được một bài kiểm thử giữ đúng danh sách đó:
Không bao giờ gửi: khóa bí mật, tên tài khoản, tên dịch vụ, mã, hay các trang web nơi chúng được dùng. Máy chủ lấy quốc gia từ yêu cầu ngay tại lớp biên (edge) và không lưu địa chỉ IP. Trang gỡ cài đặt nhận cùng mã định danh cài đặt đó dưới dạng ?i=: trang báo cho máy chủ biết bản cài đặt đã bị gỡ, và gắn câu trả lời khảo sát không bắt buộc với bản cài đặt đó.
Phần được lưu trong chrome.storage.local cho việc này: mã định danh cài đặt, chính sách và giấy phép đã ký gần nhất, khóa giấy phép mà bản cài đặt này đang giữ (do người dùng nhập, hoặc nhận được sau khi mua trên chính bản cài đặt này), số lần mở theo từng ngày cho đến khi máy chủ nhận được, cùng các sự kiện đang chờ gửi — không có dữ liệu tài khoản nào. Khi đồng bộ đang bật, thông tin bản cài đặt có từ trước khi áp dụng thanh toán hay không và khóa giấy phép đó cũng được đưa vào Chrome Sync, để các hồ sơ Chrome khác của người dùng nhận được và tự bật Pro; tắt đồng bộ sẽ xóa cả hai khỏi Chrome Sync, bật lại thì chúng được đưa trở lại.
Những gì được trả về, và cách tiện ích xử lý chúng:
Giới hạn này không phải DRM: mã nguồn là mã mở, và một bản fork có thể gỡ nó đi. Điều không bao giờ được phép xảy ra là một người lấy được hoặc dùng được giấy phép của người khác, hay khiến bản cài đặt của người khác bị giới hạn — đó là lỗ hổng, và nằm trong phạm vi chính sách bảo mật của chúng tôi.
Có hai loại yêu cầu tự diễn ra: kiểm tra đồng hồ và lần liên lạc thanh toán hằng ngày. Mọi thứ còn lại bên dưới chỉ xảy ra vì người dùng đã bấm vào. Manifest V3 cấm mã từ xa, và không mục nào ở đây mang theo tài khoản, khóa bí mật hay mã đã sinh ra. Danh sách đầy đủ:
| Máy chủ | Khi nào | Có mang dữ liệu người dùng không? |
|---|---|---|
| time.akamai.com timeapi.io cloudflare.com | Kiểm tra lệch đồng hồ, có cache; nếu không nguồn nào phản hồi, phần Cài đặt sẽ cho biết. Đồng hồ lệch là TOTP hỏng. | Không |
| authenticator.sh | Trang chào mừng khi cài đặt; trang góp ý khi gỡ cài đặt, với mã định danh cài đặt trong địa chỉ; trang trợ giúp và hỗ trợ khi mở từ cửa sổ tiện ích. | Mã định danh cài đặt, chỉ trên trang gỡ cài đặt; ngoài ra thì không (chỉ log máy chủ web thông thường) |
| api.authenticator.sh | Lần liên lạc thanh toán mỗi ngày một lần; các lệnh gọi thanh toán, giấy phép và cổng khách hàng khi người dùng mua Pro, nhập khóa, khôi phục giao dịch mua hoặc quản lý gói đăng ký. | Các trường liệt kê ở trên — không bao giờ có dữ liệu tài khoản. Khóa giấy phép hay địa chỉ email chỉ khi người dùng tự nhập vào |
| checkout.stripe.com billing.stripe.com | Stripe Checkout và cổng khách hàng, mở trong một tab khi người dùng mua Pro hoặc quản lý gói đăng ký. | Những gì người mua nhập ở đó. Áp dụng điều khoản riêng của Stripe và Link |
| chromewebstore.google.com | Trang trên cửa hàng, chỉ mở trong tab mới khi bấm: biểu mẫu đánh giá từ lời mời đánh giá. | Không (Google thấy đây là một lượt xem trang cửa hàng như mọi lượt khác) |
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.
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:
.crx đã phát hành từ Chrome Web Store và giải nénnpm ci && npm run build trên Node 20 LTSdist/ thu được với gói đã giải nénMỗ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ồnChú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á:
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à một máy chủ mà ngay từ đầu không bao giờ nhận khóa bí mật, tên tài khoản hay mã của bạn.
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.