سیدنا

امنیت و رمزنگاری

چه چیزی را چگونه محافظت می‌کنیم، و دقیقاً چه چیزی را ادعا نمی‌کنیم.

آخرین بازبینی: ۲۰۲۶-۱۰-۲۴

خلاصه: اطلاعات مالی شما پیش از همگام‌سازی روی گوشی رمزنگاری سرتاسری می‌شود؛ گذرواژه و کلید بازیابی هرگز از گوشی خارج نمی‌شوند؛ ما فقط چیزی را ادعا می‌کنیم که بتوانیم نشان بدهیم.

روی گوشی شما

  • پایگاه‌دادهٔ Room با SQLCipher رمزگذاری می‌شود. گذرواژهٔ آن تصادفی است و در EncryptedSharedPreferences با پشتوانهٔ Android Keystore نگه‌داری می‌شود.
  • توکن‌ها و کلیدها در حافظهٔ رمزگذاری‌شده ذخیره می‌شوند.
  • ورود زیستی اختیاری از کلیدی در Keystore استفاده می‌کند که زیست‌سنجی قوی می‌خواهد.

پیش از ارسال: رمزنگاری سرتاسری

هر رکورد همگام‌شده با یک کلید دادهٔ تصادفی ۲۵۶ بیتی و AES-256-GCM رمزگذاری می‌شود. کلید داده روی سرور فقط به‌شکل «بسته‌بندی‌شده» نگه‌داری می‌شود: یک‌بار زیر کلیدی مشتق‌شده از گذرواژهٔ شما و یک‌بار زیر کلیدی مشتق‌شده از کلید بازیابی.

پروتکل نسخهٔ ۲: گوشی با PBKDF2-HMAC-SHA256 (گذرواژهٔ نرمال‌سازی‌شده با NFKC، ۶۰۰٬۰۰۰ تکرار، نمکِ مخصوص هر حساب) یک کلید اصلی می‌سازد و آن را با HKDF به دو مقدار مستقل تقسیم می‌کند: یک کلید بسته‌بندی که هرگز از گوشی خارج نمی‌شود و یک راز احراز هویت که تنها چیزی است که به سرور می‌رود. بازیابی هم با یک کلید بازیابی تصادفی ۲۵۶ بیتی به همین شکل کار می‌کند (فقط یک «اثبات» مشتق‌شده فرستاده می‌شود، نه خود کلید). پاکت‌ها AES-256-GCM هستند و با AAD به هدفشان بسته شده‌اند. پس سرور نه گذرواژه دارد، نه کلید بازیابی، و نه کلیدی که بتواند کلید داده را باز کند.

احراز هویت

  • راز احراز هویت مشتق‌شده از گذرواژه، یک‌بار دیگر با Argon2id هش می‌شود؛ نشت پایگاه‌داده چیزی مستقیماً قابل‌استفاده نمی‌دهد.
  • برنامه پارامترهای KDF کمتر از حداقل پشتیبانی‌شده را نمی‌پذیرد.
  • توکن دسترسی کوتاه‌عمر (JWT، HS256، بررسی issuer، نسخه‌دار بر اساس نشست) و توکن نوسازی چرخشی با تشخیص استفادهٔ مجدد.
  • قفل حساب پس از تلاش‌های ناموفق مکرر، محدودیت تعداد تلاش برای کد یک‌بارمصرف و محدودیت نرخ برای هر IP و کاربر.
  • هشدار ورود دستگاه جدید و خروج از راه دور.

انتقال و استقرار

  • فقط HTTPS (ارتباط رمزنشده فقط در نسخه‌های دیباگ مجاز است).
  • پایگاه‌داده و API فقط روی شبکهٔ داخلی Docker در دسترس‌اند و راه‌اندازی در حالت تولید، رمزهای ضعیف یا خالی را نمی‌پذیرد.

حریم تصویر و پشتیبان‌گیری

پنجرهٔ برنامه به‌طور پیش‌فرض FLAG_SECURE دارد (بدون اسکرین‌شات و با نمای خالی در برنامه‌های اخیر) و در تنظیمات قابل تغییر است. پشتیبان‌گیری و انتقال دستگاه اندروید کاملاً کنار گذاشته شده است.

دامنه و محدودیت‌ها (لطفاً بخوانید)

  • اطلاعات مالی سرتاسری رمزنگاری می‌شوند: نه اپراتور و نه مهاجمی که سرور را در اختیار گرفته، بدون حدس‌زدن گذرواژهٔ کاربر نمی‌تواند آن‌ها را بخواند. خطر باقی‌مانده، حدس‌زدن آفلاینِ گذرواژه‌های ضعیف توسط کسی است که راز احراز هویت را ضبط کرده (همان مدل مدیران رمز رایج)؛ برای همین گذرواژهٔ بلند و منحصربه‌فرد توصیه می‌کنیم و KDF عمداً سنگین است.
  • خارج از پوشش رمزنگاری: فراداده‌ای که سرویس برای کار کردن لازم دارد (شماره موبایل، مشخصات نمایه، فهرست دستگاه‌ها، زمان و حجم ترافیک همگام‌سازی). به همین دلیل سیدنا را «دانش صفر» (zero-knowledge) معرفی نمی‌کنیم.
  • اگر هم گذرواژه و هم کلید بازیابی را گم کنید، داده‌ی همگام‌شده قابل بازیابی نیست.
  • کتابخانه‌های امنیتی جایگزین ممیزی مستقل نیستند.

گزارش آسیب‌پذیری

لطفاً مشکل امنیتی را به‌صورت خصوصی و از طریق ایمیل cidna.app@gmail.com گزارش دهید و آن را به‌صورت عمومی منتشر نکنید. security.txt