Q-bart написав:І використовувати PyQt?
Ну колись треба почати?
Для зберігання відповідей користувачів рекомендую зберігати в .csv чи .tsv, а самі тести в .xml чи хоча би в повноцінному .json, бо те в чому ви зберігали курси здається не зовсім нагадує його.
Якщо хочете створити повноцінну версію, яку зможуть використовувати освітяни, то треба одразу робити структуру клієнт-сервер, або зберігати тест у двох копіях (з правильними відповідями та без них).
Клієнт результати тестів може потім шифрувати асиметричним шифруванням за допомогою бібліотекою Libgcrypt-py (Python версія gpg бібліотеки) та відправляти на сервер, відкритий ключ клієнт отримуватиме при створенні облікового запису студента (учня) від сервера. Сервер надсилає клієнту тест без даних про правильні відповіді.
В автономній версії використати симетричне шифрування для файлу тесту з відповідями. Тобто відповідає студент чи учень на всі питання, потім викладач (учитель) запускає перевірку перед тим вказавши місце збереження ключа, розшифрував, проаналізував, результат вивів.
А ще краще обидві версії в одній програмі.
Щодо вимог до тестів можу написати згодом коли спитаю у знайомого викладача який робив свою систему. Звісно якщо це цікавить вас. Щодо безпеки, то тут кілька речей:
1. Тест з відповідями має зберігатися зашифровано, а ключ бути окремо від програми та не зберігатися в її налаштуваннях.
2. Файл з пройденим тестом має бути і бажано зі зашифрованою копією (для архіву).
3. Клієнт немає генерувати закритих ключів, якими шифрують дані.
4. Результати шифрувати асиметричними ключами, а тести семеричними.
5. В результатах має бути завжди унікальний ідентифікатор тесту, питання та дані відповіді, а краще і можливі (треба для архіву, бо тести буває гублять з часом, а результати які неможливо розшифрувати і оцінити вручну не мають сенсу)
6. Тимчасові файли не мають містити ні тестів, ні результатів, ні ключів.
7. Обмін даними між сервером і клієнтом має бути шифрованим.
Ці заходи безпеки були продиктовані прогресивністю студентів та учнів, які навчилися прості програми зламувати впродовж кількох тижнів.
▼Як реалізовано у знайомого викладача
0. При встановленні, сервер генерує пару ключів, відкритий (client.key) потім зберігають у клієнтів, а закритий (server.key) у сервера. Потім симетричний ключ адміна (data.key).
1. При запуску клієнт генерує пару ключів (open_client.key, close_client.key), їхня довжина значно менше за встановленні (client.key та server.key). Подає зашифрований ключем client.key запит до сервера на отримання ключа сесії та надсилаючи при цьому open_client.key.
2. Сервер розшифровує отриманий запит і ключ за допомогою ключа server.key. Генерує свою пару ключів (open_server.key та close_server.key, при тому кожному клієнту своя пара), їхня довжина така сама як отриманого від клієнта. Надсилає зашифровану відповідь зашифровану ключем open_client.key, яка містить open_server.key та ID клієнта, який присвоює сервер при підключені клієнта.
# З цього моменту всі запити що надсилає клієнт зашифруються ключем open_server.key, а відповіді до клієнта open_client.key. Ну а розшифровуються відповідно ключами close_server.key та close_client.key на стороні отримувача. Тож слова шифрується і розшифровується не пишу.
3. Після цього клієнт запитує у сервера перелік груп та навчальних закладів. Той виймає його з БД, перемішує (рандомно) послідовність і надсилає.
4. Отримавши переліки клієнт впорядковує за абеткою, та пропонує зареєструватися студенту (ПІП, група, навчальний заклад). Отриману форму надсилає серверу (не ID). Той у відповідь повертає перелік доступних тестів та результати (бал, дата, кількість спроб, крайній термін здачі, витрачений час на проходження) по пройдених, вийнявши їх з БД та перемішує (рандомно) послідовність. Всі тести мають ID (realID) та тимчасовий (tempID) який для кожного клієнта свій та змінюється кожній сесії. Асоціативна таблиця тимчасових і реальних ID зберігається в тимчасових таблицях БД.
5. Після вибору студентом тесту, надсилається ID обраного. Сервер розшифровує симетричним ключем data.key тест в файлі .xml, генерує xml без позначок правильних відповідей чи балів за них, виймає з кожної групи (за рівнем складності) визначену кількість запитань рандомом (інфа в зашифрованому файлі тесту), перемішує (рандомно) послідовність записів та надсилає.
6. Клієнт отримавши по мітках послідовності та груп відновлює порядок. Студент проходить тест. Після завершення надсилається серверу xml що отримав (перемішує перед тим порядок записів) але з позначками відповідей та часу затраченому, доданою інфою (ПІП, група, заклад, час і дата надсилання).
7. Сервер отримавши відновлює послідовність, оцінює відповідно, вносить інфу про результат в БД та надсилає відповідь з балом. Додає інфу про правильні відповіді до відповідей студента до отриманого xml, шифрує ключем data.key та зберігає на диску.
8. При завершенні роботи клієнт подає запит на закриття сесії, видаляє всі ключі крім client.key, а сервер ключі close_server.key та open_client.key які згенерував для цього клієнта та отримав від клієнта, знищує всі тимчасові таблиці (точніше всі записи в тимчасових таблицях) про цього клієнта.
P.S. На думку викладача "всі студенти шахраї". Тож не дивуйтеся параної.