Private by Design: How we built Firefox Sync
Bài tóm tắt Mozilla 2018 3. Quy mô lớn Độ khó: Trung bình
Mozilla · 2018 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc
Bối cảnh
- Firefox Sync đồng bộ bookmark, lịch sử, mật khẩu giữa các thiết bị cho hàng triệu người dùng. Mozilla muốn dữ liệu đồng bộ được mã hoá mặc định sao cho chính Mozilla không đọc được.
- Theo Mozilla, phần khó của mã hoá là khoá: khoá sinh ở đâu, nằm ở đâu, đi qua đâu. Nhà cung cấp tự giữ khoá thì mã hoá không chống được mối đe doạ đáng lo nhất.
Thay đổi chính
- Mật khẩu không bao giờ rời máy. Máy người dùng dẫn xuất passphrase thành hai giá trị không suy ra được nhau: một authentication token gửi lên server thay cho mật khẩu, và một khoá mã hoá ở lại máy. Cả hai qua 1.000 vòng PBKDF2, tách miền bằng HKDF với
infokhác nhau. - Server băm token thêm một lần bằng scrypt (N=65536, r=8, p=1) trước khi lưu, để cơ sở dữ liệu token khó bẻ hơn.
- Khoá dẫn xuất từ passphrase dùng để mở một khoá mã hoá dữ liệu (sinh lúc setup, server chỉ thấy bản đã bọc); dữ liệu mã hoá AES-256-CBC kèm HMAC.
- Lịch sử thiết kế: giao thức Sync ban đầu dùng ghép thiết bị thủ công (khoá sinh sẵn, mang sang máy mới); tháng 4/2014 (Firefox 29) đổi sang dẫn xuất từ mật khẩu vì người dùng mất thiết bị là mất luôn dữ liệu, và mật khẩu làm số người dùng Sync tăng đáng kể.
- Bài tự nhận các hằng số đã cũ: 1.000 vòng PBKDF2 là đánh đổi cho thiết bị yếu thời đó (token chỉ đi qua HTTPS có HPKP và không được lưu), CBC+HMAC nên nâng lên chế độ có xác thực.
Vì sao
- Mozilla so ba phương án khác: (1) nhà làm trình duyệt đọc được dữ liệu (theo bài, mặc định của Chrome); (2) mật khẩu riêng cho mã hoá (Chrome, Opera tuỳ chọn; Vivaldi mặc định): theo Mozilla dễ nhầm và người dùng hay đặt trùng, còn tuỳ chọn thì hiếm ai bật; (3) ghép khoá thủ công (Brave): an toàn nhưng khó khôi phục, không đổi được passphrase khi bị lộ.
- Firefox chọn biết danh sách thiết bị của người dùng (lộ thêm thông tin) để người dùng thấy và thu hồi thiết bị lạ; Brave chọn không biết. Theo Mozilla đây là đánh đổi có chủ đích.
Bài học cho SWE
- Muốn nhà cung cấp "không đọc được", phải thiết kế đường đi của khoá trước: một bí mật của người dùng sinh ra cả thứ để xác thực lẫn thứ để giải mã, nhưng chỉ thứ thứ nhất đi lên server.
- Thiết kế mật mã có thể đúng mà vẫn kém dùng: bản 2014 an toàn hơn trên giấy nhưng ít người dùng hơn; mặc định quyết định bao nhiêu người được bảo vệ.
- Ghi rõ hằng số nào là nợ (số vòng, chế độ mã hoá) để nâng sau, như một phần của thiết kế.
Liên quan
Xác thực và phân quyền (authn/authz)Bảo mật hạ tầng và quản lý secretMã hoá đầu cuối và hệ thống mà server không được đọc
Được nhắc tới trong
Chủ đề (3)
Công ty (1)
Bài tóm tắt (1)