Безопасность приложения для голосования

У меня есть проект по созданию настольного приложения для голосования для класса на Java. Хотя безопасность не является целью проекта, я хотел бы быть максимально реалистичным. Каковы некоторые из основных инструментов для интеграции безопасности в приложение Java.

Обновлено: я в первую очередь не беспокоюсь о физической безопасности, мы просто создаем приложение, а не всю систему. Я хочу убедиться, что голоса записываются правильно и не могут быть изменены или прочитаны кем-то другим.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
595
8

Ответы 8

Это действительно зависит от того, какую систему безопасности вы хотите интегрировать. Вы хотите, чтобы безопасность гарантировала, что пользователь не запускает какие-либо отладчики или тому подобное, чтобы переключать биты в вашем приложении для изменения голосов? Вы хотите убедиться, что пользователь не установит программное обеспечение для ведения журнала, чтобы отслеживать, кто за кого голосовал? Вы хотите убедиться, что человек, который должен голосовать, действительно голосует? Безопасность - это очень обширная тема, и трудно дать ответ, не зная, что именно вы ищете.

Если вы ищете объяснение этого материала «более высокого уровня» (например, не код), Прикладная криптография содержит довольно много соответствующих примеров (и я считаю, что раздел «безопасные выборы» охватывает некоторые стратегии голосования).

Я считаю, что физическая безопасность важнее для системы кабины для голосования, чем безопасность кода. Эти машины по своей природе не должны подключаться к каким-либо общедоступным сетям, особенно к Интернету. Но очень важно иметь хорошую физическую безопасность, чтобы предотвратить любое физическое вмешательство.

Меня в первую очередь не беспокоит физическая безопасность, мы просто создаем приложение, а не всю систему. Я хочу убедиться, что голоса записываются правильно и не могут быть изменены или прочитаны кем-то другим.

Отложив в сторону вопросы защиты от физического вмешательства (например, в базовую базу данных), поскольку вы оговорили, что физическая безопасность не является предметом настоящего беспокойства ...

Я думаю, что в первую очередь нужно учитывать, как обеспечить, чтобы данный избиратель голосовал только один раз. При бумажном голосовании каждый зарегистрированный избиратель ограничен определенной кабиной / местом, и проверка осуществляется по имени + SSN и подписи.

Вам может потребоваться захват цифровой подписи с высоким разрешением и, следовательно, периферийное устройство для захвата сенсорного экрана или терминал с сенсорным экраном. Более сложным подходом был бы биометрический сканер, но для этого потребовались бы правительственные записи отпечатков большого пальца / пальца или сканирование сетчатки глаза - я уже вижу, как защитники конфиденциальности выстраиваются в очередь в офисах юриста.

Другой подход заключается в том, чтобы «регистратор» избирателя выдавал каждому избирателю цифровые ключи перед выборами - (относительно) короткий (криптографически стойкий) случайный буквенно-цифровой ключ, который вводится вместе с именем избирателя и / или SSN в заявление. Знание этого ключа требуется конкретному избирателю на этих конкретных выборах. Эти ключи будут выдаваться по почте в конвертах с защитой от вскрытия, как те, которые используются банками для почтового подтверждения банковских переводов и доставки номеров PIN. Ключ должен включать данные контрольной суммы, чтобы пользователь мог сразу же проверить его ввод, и он должен быть в группах по 4, например, XXXX-XXXX-XXXX-CCCC.

Любые другие «секретные» знания, такие как SSN, вероятно, слишком легко обнаруживаются для большого процента населения (хотя мы, кажется, не можем заставить организации, выдающие кредиты, понять это), и поэтому не подходят для аутентификации.

Подсчет голосов может быть произведен путем создания файла с зашифрованными данными с открытым ключом, который передается (через сеть кроссовок?) В центральную систему. Это должно включать идентификационную информацию «кабины для голосования» и запись для каждого избирателя, включая их SSN и цифровой ключ (или подпись, или биометрические данные). Голоса с недействительными ключами исключаются. Множественные голоса с одним и тем же ключом и одними и теми же голосами рассматриваются как один голос за этого кандидата. Несколько голосов с одним и тем же ключом и разными голосами помечаются для расследования мошенничества (с избирателем связывается по телефону, выдается новый ключ и направляется на повторное голосование).

Моя компания недавно разработала приложение с очень высокой степенью защиты. Может, это поможет.

Наше приложение

Это было приложение java EE.

Архитектура следующая:

  1. На клиентском компьютере есть пакет криптографии.
  2. Грязный сервер, в котором хранится пользовательский ввод и вывод зашифрованный
  3. Чистый недоступный извне сервер, в котором хранятся ключи и расшифрованные данные.

Пользователям выдаются криптографические карты (вы можете использовать что-то менее безопасное - например, pgp), и страницы jsp требуют от них шифрования всего ввода. Страница содержит компонент, который подключается к приложению Cryctography, запрашивает у пользователя ключевую парольную фразу, шифрует ее открытым ключом сервера и подписывает закрытым ключом пользователя, а затем отправляет.

Данные хранятся на внешнем сервере, затем передаются на внутренний сервер, где они дешифруются и проверяется подпись, затем данные обрабатываются и повторно шифруются, затем отправляются на грязный сервер, после чего пользователь может их получить.

Таким образом, даже если кто-то взломает грязный сервер (даже получит базу данных), он получит в основном бесполезные данные.

Ваше приложение

Я отправлял зашифрованные и подписанные голоса на сервер. Он утверждал бы две вещи:

  1. Вы знаете, кто отправил голос
  2. Никто не сможет узнать, что это было за голосование.

Затем получите данные с сервера, подтвердите, что все проголосовали не более одного раза, подсчитайте голоса, вуаля!

Ваша проблема в том, что вам необходимо надежно идентифицировать пользователя, чтобы вы могли предотвратить его повторное голосование и доступ к голосам друг друга.

Это ничем не отличается от любого другого настольного приложения, которое требует аутентификации (и, возможно, авторизации). Если ваши избиратели представляют собой закрытую группу в сети с учетными записями пользователей, вы можете интегрироваться с каталогом и потребовать от пользователей входа в систему.

Если избиратели не имеют учетных записей пользователей сети, вот тут-то и становится интересно. Каждому пользователю по-прежнему необходимо будет пройти аутентификацию в приложении. Вы можете создавать учетные записи с паролями в приложении и безопасно распространять эту информацию до голосования. Ваше приложение может попросить пользователей выбрать пароль при первом доступе к приложению.

Не зная подробностей, сложно дать более конкретный ответ.

Вам известно, что электронное голосование - это нерешенная исследовательская проблема? Крупномасштабное мошенничество требует больших усилий.

Я, вопрос был скорее в общих рекомендациях / практиках.

Justin Yost 08.07.2009 09:05

Другие вопросы по теме