15.09.2014

ЗоПД, обезличивание и аутентификация

Как известно, закон строг, но справедлив. К ЗоПД можно отнести только первую часть известного высказывания. Похоже, создавался этот закон совершенно для иных целей. Но, как бы то ни было, выполнять его все же надо. Многие организации его не выполняют, надеясь на русский "авось", но это когда-нибудь может выйти боком.

Почему никто не любит этот закон, кроме некоторых граждан, использующих его в целях недобросовестного обогащения? Ответ банален: потому что он очень дорог.
Один из законных способов практически обойти закон стороной очень прост, но трудно реализуем. Речь, понятно, идет об обезличивании данных.

Трудности тут связаны с тем, что обезличивать данные очень не удобно, и, чаще всего, невозможно. Что значит обезличить данные? Это значит убрать из персональных данных все сведения, по которым можно установить личность человека, к которым эти данные относятся. То есть сюда сразу автоматически попадают фамилия, имя и отчество, а также все федеральные идентификаторы (номер паспорта, СНИЛС и ИНН). Естественно, чаще всего из базы трудно убрать как минимум ФИО по тем или иным причинам, а также идентификаторы. Это может быть связано как с особенностью работы организации, так и с тем, что эти сведения по закону требуется передавать в гос. органы.
Но все же иногда бывают ситуации, когда идентифицирующие человека признаки могут быть удалены из некоторых баз, которые используются для организации производственных процессов. В этом случае ФИО и прочие атрибуты заменяются каким-то внутренним идентификатором. Например, это может быть табельный номер сотрудника или номер студенческого билета. В случае отсутствия подобных атрибутов могут использоваться автоматически генерируемые номера, которые выдаются клиентам программной системы.
И если с автоматической аутентификацией клиента при удаленном использовании системы особых проблем не возникают, все методы такой аутентификации известны и хорошо разобраны, то в случае, когда требуется ручная аутентификации субъекта ситуация не так радужна.
Ручная аутентификация может потребоваться в том случае, когда удаленный доступ к системе не предусмотрен или не возможен.

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

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

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

Также такое значение хэш-функции может использоваться и для поиска связанной с субъектом информации по его идентифицирующей персональной информации. В этом случае на рабочем месте оператора вводится необходимая информация, хэшируется и полученное значение отправляется на сервер для поиска. Таким образом, идентифицирующая персональная информация не передается по сети, что позволяет практически отказаться от дополнительных мер защиты, навязываемых подзаконными актами к ЗоПД.
В принципе, так как по значению хэш-функции в данном ее применении не возможно предпринять каких-либо деструктивных действий, то особых требований к ее криптостойкости нет. Поэтому можно использовать как стандартные алгоритмы, такие как MD5, SHA-2 или ГОСТовской вариант. Недостаток таких функции состоит в их достаточно высокой вычислительной сложности, что не всегда удобно. Поэтому можно использовать и свои, более простые варианты хэш-функций.

С точки зрения ЗоПД использование значения функции свертки вполне легально, так как там не определены способы получения идентификатора для обезличивания данных.

6 комментариев:

  1. Недостаток данного подхода, что заполучив табличку с хэшами можно организовать перебор по словарю.

    Скажем для ФИО + дата рождения + место рождения берем 1000 популярных фамилий, 100 имен, 100 отчеств, 1000 дат (30 лет), 1000 мест рождений и того всего 10^13 вариантов. При скорости 10^9 в секунду - вся табличка будет расшифрована за 3 часа. Конечно не вся, так как уникальных фамилий и имен много больше чем 1000, но большая ее часть.

    Дополнительные персоональные данные конечно замедлят процесс - но сути не меняют, да и перебор легко распаралеливается.

    Другой недостаток, что менее надежная система ослабляет более надежную. По одной - нашли привязку ФИО к табельному номеру, по другой - паспортные данные, благо ФИО уже известны.

    ОтветитьУдалить
  2. Да, это известный подход радужных таблиц. По нему есть несколько замечаний. Во-первых, построение такой таблицы потребует достаточно большого места на диске, что бы ей пользоваться. Во-вторых, построение займет намного больше времени, так как 10^9 генераций в секунду может дать только специализированный компьютер. Это связано с тем, что это не пароль, который там ну максимум 20 символов, ФИО+дата рождения+город рождения - это МИНИМУМ 20 символов и более. Что, соответственно, замедляет построение таблиц и делает их большими. В-третьих, ты маленько ошибся 1000 дат - это всего 3 года. Ну и самое главное, из этих 10^13 вариантов только очень не большая часть будет соответствовать реальным людям. То есть нужно проделать большую работу, что бы получить малозначашие данные, например, сведения об успеваемости студентов. :)
    Самое главное, что моя статья не о том, как защитить данные. А о том, как красиво и не нарушая обойти закон о персональных данных. Ты сейчас в США и наверное не в курсе, что в соответствии с ЗоПД сейчас, например, нельзя в России обрабатывать персональные данные на обычном компьютере с обычным ПО. Нужны только сертифицированные. При работе через интернет нельзя пользоваться распространенными методами шифрования, а только российскими. Все это стоит достаточно серьзеных денег. И не понятно зачем сделано.
    Ну и еще одно. В случае, если такой подход используется при хранении более серьезных данных, утечка которых крайне нежелательно, то можно просто данные посолить. После чего про радужные таблицы можно забыть.

    ОтветитьУдалить
    Ответы
    1. 1. Про радужные таблицы в курсе, но не вижу здесь в них смысла. Просто в памяти перебираем все возможные варианты, считаем хеши и ищем в сворованной базе студентов.
      2. ФИО действительно длинный, но это не набор случайных букв в отличии от пароля, к тому же самые распространненые алгортмы хеширования - они блочные. В SHA-1 размер блока - 64 байта (32 символа уникода), так что хоть 1 символ, хоть 32 - скорость одинаковая. 10^9 для SHA-1 на современных GPU вроде получают: http://golubev.com/gpuest.htm
      3. Да действительно извиняюсь, просчитался, и того перебор 10^14.
      4. Допустим что есть 2 системы, одна - хранит только успеваемость, использует только ФИО и дату рождения в хеше, другая - хранит более конфиденциальные данные и для надежности добавляет соль, паспортные данные + место рождения. Данные 1-й системы мало интересны, но нахождение их - существенно упрощают перебор для 2-й системы, так как ФИО и дата рождения будут известны, осталось подобрать паспорт и место рождение, ну и соль заставляет подбирать хеш за хешем, а не все скопом.

      Про закон я слышал и впрямь бредовый и невыполнимый, так и обратно до бумаги вернуться недалеко.

      А в нем прям регламентируется что можно, а что нельзя? Скажем хеш - пожалуйста, а элементрарное обратимое шифрование (например просто постоянное смещение к символам) - нельзя? Где грань?

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

      Удалить
    2. 2. А если 33 символа? А если SHA-2? А если свой алгоритм, который не реализован на GPU?
      4. А зачем нам использовать разный подход на двух системах? Используем всегда один. Это во-первых. Во-вторых, мы можем и на первой системе использовать соль. Ну и в третьих, если мы как-то узнали данные о человеке (ФИО и паспортные данные), то все остальное утянуть уже без проблем. :) Это может оказаться проще, чем устраивать сложный перебор.

      Удалить
    3. 2. Медленный алгоритм - вполне работающий способ защиты, как и соль. Правда я бы не стал писать свой алгоритм - не лёгкое это дело криптография. На сколько я помню есть спец. медленные алготитмы. Например bcrypt.
      4. Совсем одинаковый - не получится. Одним ФИО - достаточно, другим ИНН нужен, третьим паспорт и ключи от квартиры :) Кто-нибудь да забудит посолить или ещё что выкинит. Плюс локальную базу проще стащить.

      Я за центральный сервер и стандартные и проверенные алгориты, так контроля больше. Но платить за какие-то супер правильные алгоритмы и защиту - это помоему здесь перебор. Не те это данные...

      Удалить
    4. Вот да, надо использовать стандартные методы. И защищать тогда, когда это стоит делать. С этим согласен.

      А вот чего ты не учел в своих рассуждения, так это того, что надо не только сгенерировать хэши, но и проверить их наличие в базе. К сожалению, GPU тут не поможет. Так что время может потребоваться существенно больше.

      Ну и по 4. Те данные, которые мы вводим, используются только для аутентификации, их назад извлечь нельзя. Поэтому все базы одной организации должны использовать только один подход. Если там какой-то зоопарк, то естественно, такой подход не пойдет. Основная идея - когда аутентифицирующие человека данные вообще не нужны для работы системы, их необходимо использовать только в достаточно редких случаях аутентификации.
      То есть сам клиент не работает с системой непосредственно, работает только операторы и им ФИО и все прочее не нужны.
      Ну и да, если кто-то спер всю базу, то тут беда безусловно. Я его не рассматриваю. В случае таких угроз надо естественно использовать другие способы защиты.

      Ну и еще раз. Это не защита как таковая, а именно способ соответствовать закону. И все.

      Удалить