Перейти до вмісту
Квіт

Чи безпечно вести цикл у додатку

Редакція КвітуОпубліковано 8 хв

Відповідь залежить від одного: де лежить ключ шифрування. Три види шифрування, що видно на сервері — і чесна відповідь Квіта на власне питання, разом із ціною.

Світний ключ ліворуч; блоки, що відлітають від нього, розсипаються в нерозбірливий шум

Коротко

  • «Зашифровано» означає три різні речі: шифрування каналу (HTTPS), шифрування на сервері і наскрізне шифрування. Гарантує щось лише третє.
  • Питання, яке варто ставити застосунку, — не «чи ви шифруєте», а «де лежить ключ». Якщо ключ у застосунку, «ми не читаємо» — це обіцянка, а не механізм.
  • У Квіті ключ від локальної бази лишається у Keychain на iOS або Keystore на Android і пристрій не покидає. У хмару йде лише шифротекст, але ключ від нього зберігаємо ми — саме тому на новому телефоні записи повертаються самі.
  • На сервері у відкритому вигляді все ж видно метадані: час зміни кожного запису, їх кількість і те, чи увімкнено PIN-код.
  • Ціна названа прямо: за автоматичне повернення записів платиш тим, що технічний доступ до вивантаженого в нас є. Не вмикати хмарну копію — теж робочий вибір, і тоді ключ лишається лише в тебе.

Коротка відповідь

Залежить від однієї речі — де лежить ключ. Якщо застосунок шифрує записи ключем, який зберігає в себе, «зашифровано» означає лише «зашифровано від когось стороннього», але не від самого застосунку. Якщо ключ лишається на твоєму телефоні, прочитати записи не може ніхто — включно з тими, хто цей застосунок зробив.

Це дві різні речі, і слово «шифрування» приховує між ними різницю. Далі — як цю різницю побачити самій, у будь-якому застосунку, а не лише в нашому.

Чому «ми шифруємо дані» не є відповіддю

Майже кожен застосунок сьогодні шифрує дані, і формально не бреше. Але під одним словом ховаються три різні речі, і лише третя щось справді гарантує.

  • Шифрування каналу. Дані захищені, поки летять від телефона до сервера. Це HTTPS — його має будь-який сайт, включно з крамницею взуття. На сервері дані знову у відкритому вигляді.
  • Шифрування на сервері. Диск або база зашифровані, але ключ у того ж, хто володіє сервером. Це захищає від того, хто виніс диск із дата-центру. Від власника застосунку не захищає ніяк.
  • Наскрізне шифрування. Дані шифруються на твоєму пристрої ключем, якого в застосунку немає. На сервер потрапляє шифротекст, і власник сервера не може його розкрити навіть тоді, коли дуже хоче.

Перші два — це технічна гігієна. Третє — властивість, яку не можна скасувати обіцянкою.

Три речі, які справді можуть статися

Записи про цикл — це дані про здоров’я. Ризик тут не абстрактний, і він трьох видів.

  • Доступ ізсередини. Якщо ключ у застосунку, записи технічно може прочитати той, хто має доступ до бази. «Ми не читаємо» — це обіцянка, а не механізм.
  • Злам. База, яку можна прочитати ізсередини, читається і тим, хто отримав доступ незаконно. Кількість витоків медичних даних щороку — не гіпотеза.
  • Зміна власника або правил. Політику можна переписати будь-коли: застосунок продають, компанію купують, юрисдикція змінюється. Механізм переписати не можна: якщо ключа немає, його немає й після зміни власника.

Третій пункт найважливіший і найменш очевидний. Політика приватності — це намір на сьогодні. Архітектура — це те, що лишиться завтра.

Питання, яке варто ставити

Не «чи ви шифруєте дані» — на це відповідають «так» усі. Питання одне: де лежить ключ.

І два уточнення до нього:

  • Що саме зашифровано — усе, чи лише частина?
  • Що видно на сервері у відкритому вигляді?

Якщо на друге питання відповіді немає — це вже відповідь. Застосунок, який знає свою архітектуру, може назвати перелік полів. Застосунок, який не хоче його називати, зазвичай має що приховувати не від зловмисника, а від тебе.

Як це зроблено в Квіті

На телефоні. Локальна база зашифрована повністю. 256-бітний ключ зберігається в захищеному сховищі системи — Keychain на iOS, Keystore на Android — і пристрій не покидає. Це те саме сховище, у якому система тримає паролі й ключі твоїх власних застосунків — найзахищеніше, що вона взагалі пропонує стороннім програмам.

У хмарі. Хмарна копія необов’язкова: застосунок повністю працює й без неї. Якщо ти її увімкнула, запис шифрується безпосередньо на телефоні (AES-256-GCM) і лише потім вивантажується. На сервер потрапляє рядок виду «ідентифікатор запису, твій ідентифікатор, шифротекст, час зміни».

Де лежить ключ від хмарної копії. Тут ми зобовʼязані застосувати до себе те саме питання, з якого починається ця стаття, і відповісти на нього незручно. Ключ від локальної бази — на твоєму телефоні, і нам він не відомий: записи, які нікуди не вивантажувалися, ми прочитати не можемо. Ключ від хмарної копії — у нас. За шкалою вище це означає, що копія захищена шифруванням на сервері, а не наскрізним, і технічний доступ до вивантажених записів ми маємо.

Ми кажемо це просто, бо саме такої відповіді вимагає перевірка, яку ця стаття пропонує робити з іншими застосунками. Застосунок, що вчить питати «де ключ», не має права ухилитися сам.

Що на сервері все ж видно

Це найважливіша частина, і саме її зазвичай не пишуть. У відкритому вигляді видно:

  • час останньої зміни кожного запису;
  • їхня кількість;
  • чи ти увімкнула вхід за PIN-кодом або біометрією.

Плюс одна річ, яку теж треба назвати: наявність файлу в сховищі фото щоденника показує сам факт, що ти ведеш щоденник вагітності. Його вміст лишається шифротекстом.

Тобто сервер бачить, що ти щось записуєш і коли. Він не бачить, що саме. Ми називаємо це вголос, бо застосунок, який стверджує, що на сервері не видно взагалі нічого, або не розуміє власної архітектури, або описує її неточно.

Розділ 3.2 політики приватності описує, що саме лежить на сервері: непрозорий блоб, у якому не видно ні вмісту, ні навіть назв полів. Метадані вище — це те, що лишається навколо цього блоба, і ми називаємо їх тут, бо політика, яка зупиняється на «ми не можемо це прочитати», лишає за кадром цікавішу половину.

Кому передаються дані

Власних серверів у Квіта немає, тому постачальники названі поіменно — усі п’ять: Supabase (база, сховище та авторизація; ЄС, регіон Ірландія), Qonversion (статус підписки, без даних про здоров’я), Apple і Google (оплата, керування підпискою й вхід), Google (Firebase) (технічні ідентифікатори встановлення й доставка сповіщень, коли вони увімкнені) і Cloudflare (розміщення сторінок на kvitcare.com — бачить IP-адресу, коли ти відкриваєш цей сайт, і нічого з застосунку).

Поіменний перелік — це теж механізм, а не ввічливість: назвавши постачальника, ми позбавляємо себе можливості тихо додати ще одного. Хто саме що бачить і скільки це живе — розібрано по рядках у матеріалі Хто бачить твої записи.

Ціна такого підходу

Тут є ціна, і про неї краще знати заздалегідь. Вона не там, де була раніше.

Обидві властивості одночасно мати неможливо, і це не наша особливість, а властивість самої задачі. Або застосунок може повернути тобі доступ — і тоді він технічно може прочитати твої дані. Або не може ні того, ні іншого.

Раніше Квіт вибирав друге, і платила за це ти: був код відновлення, який треба було зберегти, і найчастішим фіналом виявлялася не крадіжка даних, а втрачений код і втрачені записи. Коду більше немає. Ми вибрали перше й забрали ключ від хмарної копії собі.

Що з цього випливає практично:

  • Не хочеш, щоб ключ був у нас — не вмикай хмарну копію. Застосунок повністю працює локально, і тоді ключ існує лише на твоєму телефоні. Ціна цього варіанта теж названа: зникне телефон — зникнуть записи.
  • Увімкнула копію — зміна телефона більше не втрата. Увійшла на новому, і записи на місці. Зберігати наперед нічого не треба, вводити нічого не треба.
  • Рішення не остаточне. Обліковий запис разом із хмарною копією видаляється однією дією, і на телефоні лишаються тільки локальні записи.

Що станеться, якщо видалити акаунт

Ще одне питання, яке варто ставити будь-якому застосунку заздалегідь, бо відповідь на нього перевіряється лише один раз.

У Квіті видалення акаунта стирає хмарну копію. Видалений запис одразу зникає із застосунку, а з сервера остаточно стирається не пізніше ніж за 90 днів — цей строк потрібен, щоб видалення дійшло до інших твоїх пристроїв, а не «про всяк випадок». Видалити акаунт можна, не встановлюючи застосунок: для цього є окрема сторінка.

Чекліст для будь-якого застосунку

П’ять питань, на які відповідь має бути в документі, а не в описі в сторі:

  1. 1.Де зберігається ключ шифрування?
  2. 2.Що саме зашифровано, а що ні?
  3. 3.Що видно на сервері у відкритому вигляді?
  4. 4.Хто ще отримує дані — і чи названі вони поіменно?
  5. 5.Що станеться з даними, якщо видалити акаунт?

Відсутність відповіді на будь-яке з них — це теж відповідь. І ще одна перевірка, яка займає хвилину: відкрий політику приватності застосунку й пошукай слово «рекламні партнери» або «афілійовані особи». Якщо перелік не названий поіменно, він відкритий.

Чого в Квіті немає, і що в ньому є

Рекламних бібліотек у застосунку немає, реклами теж, і дані не продаються й не передаються брокерам даних.

Аналітика в застосунку є, і назвати її треба прямо: Квіт використовує Google Analytics, щоб бачити, якими екранами користуються. Це вимірювання того, як користуються застосунком, а не того, що ти в ньому написала: записи зашифровані ключем, який лишається на твоєму телефоні, тож для Google вони така сама нерозбірлива стрічка.

Ще одна деталь, яку варто знати: прогноз циклу — це інформація для тебе, а не рішення про тебе. Автоматизованих рішень із юридичними наслідками щодо тебе Квіт не приймає, і в політиці це сказано прямо.

Що це не означає

Наостанок — межа, яку теж треба назвати. Наскрізне шифрування захищає дані на сервері. Воно не захищає від того, хто взяв до рук розблокований телефон, і не робить застосунок медичним виробом.

Квіт — застосунок для самопочуття. Він не діагностує, не заміняє лікаря й не є засобом контрацепції. Про те, як він рахує й де межі його прогнозу, — у матеріалі Як рахують овуляцію.

Часті питання

Чи можуть розробники застосунку прочитати мої записи про цикл?

Залежить від того, де зберігається ключ шифрування. Якщо ключ у застосунку, розробники технічно можуть прочитати записи, і «ми не читаємо» лишається обіцянкою. Якщо ключ зберігається лише на твоєму пристрої — у Keychain на iOS або Keystore на Android — прочитати їх не може ніхто, включно з розробниками, бо ключа в них просто немає.

Що видно на сервері, якщо дані зашифровані на телефоні?

Вміст записів не видно — на сервер потрапляє шифротекст. Але у відкритому вигляді лишаються метадані: час останньої зміни кожного запису, їх кількість і те, чи увімкнено PIN-код. Наявність файлу у сховищі фото щоденника показує сам факт ведення щоденника вагітності, хоча його вміст лишається зашифрованим.

Чим наскрізне шифрування відрізняється від «шифрування даних»?

Шифрування каналу (HTTPS) захищає дані лише поки вони летять до сервера — там вони знову у відкритому вигляді. Шифрування на сервері захищає диск, але ключ належить власнику сервера. Наскрізне шифрування означає, що дані шифруються на твоєму пристрої ключем, якого в застосунку немає, — і власник сервера не може їх розкрити навіть тоді, коли дуже хоче.

Що станеться з моїми даними, якщо я видалю акаунт?

Видалення акаунта стирає хмарну копію. Видалений запис одразу зникає із застосунку, а з сервера остаточно стирається не пізніше ніж за 90 днів — цей строк потрібен, щоб видалення дійшло до інших твоїх пристроїв. Видалити акаунт можна, не встановлюючи застосунок: для цього є окрема сторінка на сайті.

Чи можна відновити дані, якщо я втратила телефон?

Якщо хмарна копія була увімкнена — так: увійди на новому телефоні, і записи повернуться самі, зберігати наперед нічого не треба. Це можливо саме тому, що ключ від копії зберігаємо ми. Якщо копію ти не вмикала, записи жили лише на втраченому телефоні, і ключа від них немає ні в кого, крім того пристрою, — тоді не відновить їх ніхто.

Читати далі