Платформа конфіденційного психологічного тестування

Тестування з повагою до приватності даних

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

Як це працює

Чотири кроки: від реєстрації респондента до готових результатів.

Крок 1
Реєстрація респондента
Сервер генерує випадковий User_Key (AES-256) і загортає його двічі: ключем з пароля респондента (PBKDF2, 100 000 ітерацій) для офлайну та своїм мастер-ключем для себе. Пароль у відкритому вигляді не зберігається.
Крок 2
Призначення та експорт .psyq
Психолог призначає методику і експортує файл завдання: відкритий заголовок, auth_bundle для входу паролем і зашифрований payload лише з питаннями. Одноразовий session_secret зберігає сервер.
Крок 3
Проходження офлайн
Респондент відкриває .psyq у плеєрі без інтернету: пароль розгортає User_Key, розшифровує питання, а прогрес автозберігається в IndexedDB у зашифрованому вигляді.
Крок 4
Імпорт .psya і результати
Файл відповідей підписаний HMAC-SHA256 і зашифрований гібридно (AES-256-GCM + RSA-OAEP). Сервер перевіряє підпис, відхиляє повторний імпорт і рахує бали за секретними формулами шкал.

Модель безпеки

Гарантії, що випливають із самої архітектури, а не з обіцянок.

Формули шкал — лише на сервері
У файл завдання потрапляють тільки питання. Шкали, ваги та інтерпретації зберігаються в БД і застосовуються лише під час імпорту відповідей.
Пароль не знає ніхто
Ні психолог, ні сервер не можуть відновити пароль респондента: зберігаються лише wrapped-ключі. При невірному паролі AuthTag AES-GCM не збігається — плеєр одразу видає помилку.
Гібридне шифрування відповідей
.psya шифрується одноразовим AES-256-GCM ключем, який, у свою чергу, шифрується відкритим ключем сервера RSA-OAEP. Читати файл може тільки сервер із приватним ключем.
Захист від повторного імпорту
HMAC-SHA256 із одноразовим session_secret підтверджує авторство відповідей; після статусу COMPLETED повторний імпорт того самого файлу відхиляється (Replay Attack неможливий).

Формати файлів

Два файли — єдиний канал обміну між платформою та офлайн-плеєром.

.psyq — файл завдання
Передається респонденту будь-яким каналом — без пароля він нечитабельний.
{ "format": "PSYQ", "version": 1, "header": { respondent, test_title, issued_at }, "auth_bundle": { kdf: { PBKDF2, 100000, salt }, wrap: { User_Key ← пароль } }, "payload": { питання + session_secret + SERVER_PUBLIC_KEY, шифр: AES-256-GCM (User_Key) } }
.psya — файл відповідей
Генерується офлайн-плеєром; захищений від читання, редагування та повторного імпорту.
{ "format": "PSYA", "version": 1, "hybrid": { key: RSA-OAEP-SHA256(одноразовий AES-ключ), data: AES-256-GCM({ answers, signature: HMAC-SHA256(session_secret, answers_json), assignment_id }) } }

Офлайн-плеєр виконує всі обчислення локально у браузері (Web Crypto API + IndexedDB) і не надсилає жодних мережевих запитів: після завантаження сторінки він працює без інтернету.

Zero network requests