MoneyFlow xử lý dữ liệu tài chính của cả gia đình, nên bảo mật được thiết kế từ đầu: dữ liệu mã hoá khi khoá máy, ứng dụng không chứa bí mật nào, và máy chủ do gia đình tự vận hành. Trang này nói rõ ứng dụng bảo vệ gì, và cũng nói thẳng những giới hạn.
Khoá ứng dụng
Bật trong Tài khoản, mục Bảo mật: "Khoá bằng Face ID" (hoặc Touch ID tuỳ máy). Công tắc chỉ dùng được khi máy đã cài Face ID, Touch ID hoặc mật mã màn hình.
- Ứng dụng khoá mỗi khi chuyển ra nền, và mở khoá bằng sinh trắc học; có thể nhập mật mã máy nếu sinh trắc học không dùng được.
- Màn khoá nằm trong một cửa sổ riêng phủ lên mọi thứ, kể cả các sheet đang mở.
- Khi ứng dụng chỉ tạm bất hoạt (chuyển đa nhiệm, thông báo kéo xuống), màn hình được che để ảnh chụp trong trình chuyển ứng dụng không lộ số liệu.
- Nếu máy không còn cài sinh trắc học hay mật mã, ứng dụng không khoá người dùng khỏi dữ liệu của chính họ.
Dữ liệu trên máy
- Dữ liệu lưu bằng SwiftData, tệp kho có mức bảo vệ
NSFileProtectionComplete: được mã hoá khi máy khoá và chỉ đọc được khi máy đã mở khoá. - Mã phiên đồng bộ lưu trong Keychain, thuộc tính chỉ dùng khi máy mở khoá và chỉ trên thiết bị này. Đăng xuất hoặc hết phiên thì mã bị xoá.
- Ứng dụng không chứa mật khẩu, mã băm mật khẩu hay khoá API nào. Khoá của nguồn giá vàng nằm trên máy chủ.
- Nếu nâng cấp kho dữ liệu thất bại, kho cũ được đổi tên và giữ lại thay vì bị xoá.
Máy chủ đồng bộ
- Xác thực hoàn toàn trên máy chủ, mật khẩu băm bằng bcrypt, phiên bằng JWT. Thời gian phản hồi khi đăng nhập đồng đều, không để lộ tài khoản nào tồn tại.
- Giới hạn số lần đăng nhập sai theo địa chỉ IP thật của người gọi và theo tên tài khoản. Giới hạn theo tài khoản đặt rộng để không ai khoá được người khác bằng cách cố tình đăng nhập sai.
- Máy chủ mặc định chỉ lắng nghe trên giao diện loopback và đứng sau đường hầm hoặc reverse proxy HTTPS. Ứng dụng dùng HTTPS nên không cần nới lỏng bảo mật truyền tải.
- Có helmet cho tiêu đề bảo mật, CORS khoá mặc định (vì chỉ ứng dụng iOS gọi tới), và giới hạn kích thước yêu cầu.
- Máy chủ từ chối khởi động nếu
JWT_SECRETthiếu hoặc còn là giá trị mẫu. Không có mật khẩu mặc định cố định:db:initsinh mật khẩu ngẫu nhiên cho tài khoản mới và không bao giờ ghi đè tài khoản đã có. - Xoá toàn bộ dữ liệu trên máy chủ chỉ dành cho tài khoản Quản lý, và chạy trong một giao dịch cơ sở dữ liệu.
Xuất CSV an toàn
Tệp CSV chống chèn công thức: ô chữ bắt đầu bằng =, +, -, @ hoặc ký tự điều khiển được thêm dấu nháy đơn ở đầu, để Excel hay Numbers không chạy nó như công thức.
Chế độ demo không chạm dữ liệu thật
Chế độ demo của bản Debug dùng kho dữ liệu riêng, tên thành viên giả, đồng bộ bị tắt và thông báo hoá đơn thật không bị ảnh hưởng. Máy từng chạy dữ liệu demo của bản cũ trong kho thật bị chặn đồng bộ cho đến khi xoá dữ liệu trên máy, để dữ liệu mẫu không thể lên máy chủ. Ảnh màn hình công khai chỉ dùng dữ liệu giả.
Giới hạn cần biết
- Một sổ chung là có chủ đích. Mọi thành viên có tài khoản đều xem được toàn bộ giao dịch của gia đình, để chia tiền chính xác. MoneyFlow không có quyền riêng tư giữa các thành viên.
- Đồng bộ không mã hoá đầu cuối. Dữ liệu sổ chung nằm trên máy chủ của gia đình, bảo vệ bằng HTTPS khi truyền và quyền truy cập máy chủ. Hãy giữ máy chủ an toàn.
- Không có khôi phục mật khẩu tự động. Quản trị máy chủ đặt lại mật khẩu bằng lệnh
npm run user:passwd. - Dữ liệu cá nhân của từng máy (tiết kiệm, vàng, nợ, hoá đơn, định kỳ) không được sao lưu lên máy chủ. Hãy dùng bản sao lưu của iOS cho máy của bạn, và xuất CSV cho giao dịch khi cần.

