Как стать автором
Обновить
3
0

Пользователь

Отправить сообщение
Номер паспорта состоит из кода региона, года и шестизначного номера. Этот тип паспорта действует 23 года. Получается 23 миллиона возможных номеров. Трудно сказать сколько человек получали паспорт в Москве, но вряд ли больше 10 миллионов. Часть из этих паспортов уже недействительна, т.о вероятность что случайное число окажется номером реального паспорта меньше 50%, скорее около 30. Но тоже неплохо
Слабым местом системы по сути является сам номер паспорта — не очень длинный, с маленьким алфавитом и хорошо известными правилами формирования.

На первый взгляд, возможны 10^10, т.е. 10 миллиардов вариантов. Но, т.к. паспорта текущего образца выдаются с 1997, а регионов в ОКАТО 83, получается меньше двух миллиардов (а если аккуратно исключить Крым и Севастополь до 2014 года, то еще меньше) номеров. Негусто.
Дополнительно известно, что всего на электронное голосование зарегистрировалось около миллиона человек.

Возможное решение
К каждому номеру паспорта генерируем достаточно длинный (64 латинских символа, например ) случайный дополнительный код: соль. Хеш от конкатенации кладем в одно поле БД, соль в другое поле БД, отметку о прохождении голосования в третье поле. Приложение и базу складываем в архив и помещаем на сервер из п.3 ТЗ.

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

Мой наколеночный код на Python с использованием стандартной библиотеки hashlib на CPU Intel Core i7 в один поток с предварительно загруженной в память БД считает около 800 тысяч хешей в секунду. Таким образом проверка одного номера паспорта занимает в среднем около 1 секунды.

С другой стороны, что бы брутфорснуть полный список номеров паспортов нужно посчитать порядка 10^15 ( (2*10^9)/2 * 10^6) хешей, т.е. при прочих равных условиях в миллиард раз больше времени. В один поток на Core i7 — около 30 лет.

Зная, что голосование проходило только в Москве и Нижнем Новгороде можно в первую очередь проверять номера паспортов этих регионов, что даст бОльшую часть данных. При таком подходе нужно будет посчитать в районе 2.3*10^14 хешей. При той же вычислительной мощности — около 300 дней.

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

Таким образом, «техзадание» непосредственным исполнителям получилось примерно такое:

  1. 30 июня около 22:00 МСК
  2. В наличие файл (exel или csv) с двумя полями: номер паспорта (некоторые номера дублированы) и отметка о голосовании
  3. Доступные серверные мощности — место для файла на 'госуслугах'
  4. Члены УИК технически не очень грамотные пользователи
  5. Решение должно быть готово к 7:00 1 июля

То что получилось на выходе — известно.

Вопрос:
Как сделать по этому же ТЗ приложение, которое дотошные журналисты (или просто пентестеры) не опозорят через неделю?
Да, да. Просто взять из паспорта любое поле в качестве соли. Дату рождения, выдачи, имя, фамилию, все вместе. Член УИК при проверке должен видеть паспорт перед собой по процедуре.
Программа телепередач оставалась более-менее неизменной довольно долго. Во всяком случае «Время» в 8:00 и в 21:00. Перед вечерним «Временем» в 20:00 «Спокойной ночи малыши».
В воскресенью блок «Утреняя почта», «Будильник», «Служу Советскому Союзу», потом микс из «Здоровья», «Сельского часа», «В мире животных», «Клуб путешественников» и «Международной панорпамы».
В детвве такие регулярно повторяющиеся события впечатываются в голову намертво.

Легкий поиск в гугле выдает такую картинку, например.
tvp1.do.am/images/c6fbc9cacb7f.jpg
Газета «Кировская правда», поэтому местное время на один час опережает московское, т.е. прямая трансляция сигнала из Москвы по местному времени идет на час позже.
2

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность