Почему размытие плохо скрывает конфиденциальную информацию

Автор оригинала: Dheera Venkatraman
  • Перевод
Наверняка все видели по телевизору и в интернете фотографии людей, специально размытые, чтобы скрыть их лица. Например, Билл Гейтс:



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

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



Кажется безопасным, ведь никто не прочитает цифры? НЕПРАВИЛЬНЫЙ ОТВЕТ. На эту схему есть атака:

Шаг 1. Получите чистое изображение чека


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

На наших примерах, конечно, это легко делается:



Шаг 2. Итерации


Используйте скрипт для перебора всех возможных номеров счетов и создания чека для каждого, разделяя группы цифр. Например, на картах VISA цифры сгруппированы по 4, поэтому вы можете индивидуально обработать каждый раздел. Это требует всего 4×10000 = 40000 изображений, что легко генерируется скриптом.



Шаг 3. Размойте каждое изображение идентично исходному


Определите точный размер и смещение в пикселях мозаичных плиток, используемых для размытия исходного изображения (легко), а затем сделайте то же самое с каждым из ваших размытых изображений. В этом случае мы видим, что размытое изображение состоит из мозаики 8x8 пикселей, а смещение определяется подсчётом от верхней границы изображения (не показано):



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



Шаг 4. Определите вектор яркости мозаики каждого размытого изображения


Что это значит? Ну, давайте возьмём мозаичную версию 0000001 (увеличено):



… и определите уровень яркости (0-255) каждой области мозаики, именуя их некоторым согласованным образом как $a=[a_1,a_2...,a_n]$:



В этом случае номер счёта 0000001 создаёт вектор яркости мозаики $a(0000001)=[213,201,190,...]$. Мы находим вектор яркости мозаики для каждого номера счёта аналогичным образом, используя скрипт для размытия каждого изображения и считывания яркости. Пусть $a(x)$ — функция номера счёта $x$. Тогда $a(x)_i$ обозначает i-тое векторное значение вектора яркости мозаики $a$, полученное из номера счета $x$. Выше, $a(0000001)_1 = 213$.

Теперь делаем то же самое для исходного контрольного изображения, которое мы нашли в интернете или где угодно, получая вектор, который мы здесь назовём $z=[z_1,z_2,...z_n]$:



Шаг 5. Найдите то, которое ближе всех к исходному изображению


Определите вектор яркости мозаики исходного изображения, назовём его $z=[z_1,z_2,...z_n]$, а затем просто вычислите расстояние от каждого номера счёта (обозначенного $x$) до вектора яркости мозаики (после нормализации):

$d(x)=\sqrt((a(x)_0/N(a(x)) - z_0/N(z))^2 + (a(x)_1/N(a(x)) - z_1/N(z))^2 + ...)$


где N(a(x)) и N(z) — константы нормализации, заданные

$N(a(x)) = (a(x)_0^2 + a(x)_1 ^2 + ...)^2$


$N(z) = (z_0^2 + z_1 ^2 + ...)^2$


Теперь просто найдём наименьший $d(x)$. Для кредитных карт только небольшая часть возможных номеров подтверждает гипотетически возможные номера кредитных карт, поэтому здесь тоже ничего сложного.

Например, в нашем случае вычисляем,

$N(z) = \sqrt(206^2+211^2+...) = 844.78459$


$N(a(0000001)) = 907.47837$


$N(a(0000002)) = 909.20647$


а затем приступим к расчёту расстояний:

$d(0000001) = 1.9363$


$d(0000002) = 1.9373$


$...$


$d(1124587) = 0.12566$


$d(1124588) = 0.00000$


$...$


Может, номер счёта соответствует мозаике 1124588?

«Но ты использовал собственное изображение, которое легко расшифровать!»


В реальном мире настоящие фотографии, а не фиктивные примеры, сделанные в Photoshop. У нас есть искажения текста из-за угла камеры, несовершенного выравнивания и так далее. Но это не мешает человеку точно определить тип искажения и создать соответствующий скрипт! В любом случае, несколько минимальных определённых расстояний могут рассматриваться как кандидаты, и особенно в мире кредитных карт, где номера красиво разбиты на группы по 4, и только 1 из 10 номеров на самом деле является валидным номером, что позволяет легко выбрать из нескольких наиболее вероятных кандидатов.

Чтобы реализовать это на реальных фотографиях, следует улучшить алгоритм расстояния. Например, можно переписать приведённую выше формулу расстояния для нормализации стандартных отклонений в дополнение к средним. Можно также независимо обрабатывать значения RGB или HSV для каждой области мозаики, а также использовать скрипты для искажения текста на несколько пикселей в каждом направлении и сравнения (что по-прежнему оставляет вам вполне ограниченное количество сравнений на быстром ПК). Можно использовать алгоритмы, аналогичные существующим алгоритмам ближайшего соседа, чтобы повысить надёжность работы на реальных фотографиях.

Так что да, я использовал своё изображение и приспособил его для данного случая. Но алгоритм, безусловно, можно улучшить для реального применения. Но у меня нет ни времени, ни желания что-либо улучшать, потому что я не охочусь за вашей информацией. Но одно можно сказать наверняка: это очень простая ситуация. Не используйте простые мозаики, чтобы размыть изображение. Все, что вы делаете, это уменьшаете объём информации на изображении, которое содержит всего $log(10^N)/log(2)$ эффективных бит данных аккаунта. Когда вы распространяете такие изображения, вы хотите устранить личную информацию, а не затруднить доступ к ней, уменьшив количество визуальной информации.

Представьте графическое изображение 100×100. Предположим, что я просто усреднил пиксели и заменил каждый из них средним значением (т. е. превратил картинку в однопиксельную «мозаику»). Вы только что создали функцию, которая из 256^(10000) вариантов хешируется до 256 вариантов. Очевидно, что с полученными 8 битами вы никак не сможете восстановить исходное изображение. Но если вы знаете, что всего существует 10 вариантов исходного изображения, то по этим 8 битам легко определите, какое из них было использовано.

Аналогия с атакой по словарю


Большинство системных администраторов UNIX/Linux знают, что пароли в /etc/passwd или /etc/shadow шифруются односторонней функцией, такой как Salt или MD5. Это достаточно безопасно, так как никто не сможет расшифровать пароль, глядя на его зашифрованный текст. Аутентификация происходит путём выполнения одного и того же одностороннего шифрования пароля, введённого пользователем при входе в систему, и сравнения этого результата с сохранённым хешем. Если они совпадают, пользователь успешно прошёл проверку.

Хорошо известно, что односторонняя схема шифрования легко ломается, когда пользователь в качестве пароля выбирает словарное слово. Все, что нужно сделать злоумышленнику, это зашифровать весь словарь английского языка, сравнить зашифрованный текст каждого слова с зашифрованным текстом, хранящимся в /etc/passwd, и выбрать правильное слово в качестве пароля. Таким образом, пользователям обычно рекомендуется выбирать более сложные пароли, которые не являются словами. Атаку по словарю можно проиллюстрировать следующим образом:



Аналогично и размытие изображения является односторонней схемой шифрования. Вы преобразуете изображение, которое у вас есть, в другое изображение, предназначенное для публикации. Но поскольку номера счетов обычно не превышают миллионов, мы можем собрать «словарь» возможных номеров. Например, все номера от 0000001 до 9999999. Затем запустить автоматическую обработку, которая помещает каждое из этих изображений на фотографию пустого фона — и размыть каждое изображение. Затем остаётся просто сравнить размытые пиксели и посмотреть, какие варианты наиболее близко соответствует оригиналу.

Решение


Решение простое: не размывайте изображения! Вместо этого просто закрасьте их:



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

Комментарии 43

    +5
    Лично я размывал все инструментом палец в фотошоп. Потом уже размытием. Интересно, если там какая-то уязвимость

    На мой взгляд размытие красивее выглядит, чем закрашивание.
      +4
      paint наше все, только в нем и замазываю
        0
        Мне кажется, что «Палец» не обладает такой уязвимостью. Особенно, если хорошенько повозить им по картинке. Алгоритм сервиса пикселизации картинок предсказуем гораздо больше.
          +7
          Палец не обладает уязвимостью пока это, ну… палец. И вы возите им сами, лично, тем самым добавляя шума.

          Начните делать это скриптом (то есть делая одни и те же движения для каждой карточки) — и, вуаля, всё раскрывается.
            +1
            Смотря какой. Хаотичная перестановка-проворот-отзеркаливание (групп) пикселей вряд ли вылечивается.
              –1
              Мне кажется
              Не надо «кажется», нужна математическая статистика и здравый смысл. Нужно взять — и проверить.
                0
                Вспомните (а лучше — попробуйте), что именно делает инструмент «Палец». И никакая статистика не понадобится. :-)
                «Палец» не размывает, а размазывает картинку.
              +1
              Ну, теоретическая возможность сбрутить ваши движения «пальцем» есть, но, конечно, вероятность очень мала. Ваш кэп.
                0
                В баду просто супер размытие))
                +5
                Старо как мир. Для Фотошопа и заквадраченных текстов даже скрипт есть — и это еще в 2008 году!
                  0
                  Там же только для скриншотов, а тут говорили про фотографии. По вашей ссылке сам автор пишет:
                  It’s very important to precisely match the font, size, spacing, color, effects like drop shadows or outlines, and even the background. If these are off even by a little bit it will throw things off. I ended up having to cheat because I couldn’t match the slick styling of the original text with my lame Photoshop design skills.
                  То есть даже для скана, в котором всегда есть искажения, это будет на порядок сложнее, не говоря уже о фотографии.
                  Да, наверно лучше избегать потенциальной опасности, но судя по этим двум постам опасность ничтожна. Во всяком случае для скрипткидди это точно недоступно.
                  +2
                  Например, Билл Гейтс:
                  По большей части это работает, поскольку нет удобного способа обратить размытие обратно в достаточно детализированное фото, чтобы распознать лицо.
                  Как знать.
                  Пикселизация Билла Гейтса всё же не случайна и цвета результирующих пикселей зависят от первоначальных деталей. YUVladimir, возможно, мог бы рассказать об этом подробнее.
                    +15
                    Уже давно используется в обратных атаках. Когда размытие или «заквадрачивание» скрывает ЛОЖНУЮ информацию (использование которой как минимум палит того, кто до неё докопался, а то и подставляет — его, или кого-то третьего).
                      +1
                      По большей части это работает, поскольку нет удобного способа обратить размытие обратно в достаточно детализированное фото, чтобы распознать лицо.

                      Наоборот же, нейросети вроде хорошо работают на размытых изображениях. На основе этого как раз работает капча, которую люди не могут пройти: http://www.humansnotinvited.com

                        0
                        а где можно про эту капчу почитать?
                        +2

                        Всё новое — хорошо забытое старое. Вот же была статья.

                          +2
                          Не имеет ничего общего с описанным в этой статье.
                          0
                          Paint -> Brush Tool же) зачем выдумывать и усложнять пикселизацией?)
                            +3
                            Отдельным пунктом можно было указать предостережение о многослойных форматах изображений.
                            Иначе ухищрения по сокрытию данных могут рассмешить того, кому будет отправлено изображение.
                              +3
                              Еще про встроенные в JPEG миниатюры.
                                +4
                                  +1
                                  Самое моё любимое — когда под баркодом замазывают надпись, но сам баркод оставляют.
                                    +1
                                    а еще можно вспомнить про «обрезанные» в Ворде изображения
                                    +1
                                    Значит, сначала надо на картинке заменить пару цифр на рандомные, и только потом пикселизировать весь номер. Пусть разгадывают…
                                      +1
                                      Вот что точно нельзя использовать, так это гауссово размытие, я так дегауссизацией размытый qr-код билета на аэроэкспресс восстановил со скрина билета, и потом сообщил об этом запостившему на форум, чтобы тот удалил своё сообщение со скрином.
                                        0
                                        Для дегауссизации существует отдельный плагин?
                                          +3
                                          Ради интереса воспользовался доступной в сети триальной версией программы, которая обещает обратить, в том числе, и гауссово размытие

                                          Размытое изображение и результат:


                                            0
                                            Благодарю. Да, выглядит неплохо. Получается, размытие по Гауссу — так сказать, условно-обратимый алгоритм. Весьма любопытно.
                                              +3
                                              Ну вообще размытие любым ядром — это просто линейное преобразование, и его обращение сводится к решению СЛУ. В общем случае не стану утверждать что-то об определённости этой СЛУ, однако никто не мешает просто минимизировать квадратичную норму невязки с каким-нибудь TV-регуляризатором, который в данном конкретном случае восстановления текста/qr-кода должен работать достаточно хорошо.
                                              0

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

                                                +2
                                                покажи
                                                +2
                                                Я и на размытом могу прочитать.
                                            +4
                                            Большинство системных администраторов UNIX/Linux знают, что пароли в /etc/passwd или /etc/shadow шифруются односторонней функцией, такой как Salt или MD5. Это достаточно безопасно, так как никто не сможет расшифровать пароль, глядя на его зашифрованный текст.

                                            MD5 — не шифрование, это хеш функйия.
                                            Пароли не шифруются, их преобразуют с помощью хешей (по идее).
                                            Хеш — не ширование и не «односторонее шифрование». Подобную ошибку делает огромное количество людей.
                                              +2

                                              Замазывание не всегда красиво выглядит. Можно заменять данные на фейковые с посланием «взломщику», а потом пикселизовать. :)

                                                0
                                                Я по тому же принципу на FPGA как-то размотал MD5 хэш предсозданной партии рулетки в онлайн-казино. Просто перебрал все возможные значения.
                                                Денег правда так и не получил от них. Слишком спалился когда ее отыграл.
                                                  +2
                                                  Число 238 написано три раза, шрифт Roboto 40, пикселизовано в GIMP с размером пикселя 10.
                                                  Все три изображения — разные.
                                                  image
                                                  Как узнать, какой конкретно способ пикселизации был использован при подготовке замазанной картинки, если учесть, что я не буду пикселизировать один и тот же номер 100500 раз?
                                                  Получается же два неизвестных, и очертания цифр, и алгоритм разбрасывания пикселей (ну, не алгоритм, но его seed)?
                                                    0
                                                    Да, возник тот же вопрос. Могу предположить что дело в том, что выбор инструментов которыми воспользуется среднестатистический пользователь, вобщем то, не высок.
                                                    Ну и дополнительное напоминание что это всё-же математичиские операции, которые можно повернуть и в обратную сторону с разной степенью усилий
                                                      +1
                                                      При пикселизации же, в отличие от размытия, даже теоретически теряется информация, как это провернуть в обратную сторону?
                                                    0
                                                    А что если пикселизацию проводить в несколько этапов? Не всю область сразу, а кусками.
                                                    image
                                                    Интуитивно кажется что должно работать, о на практике разница с одноэтапной пикселизацией выглядит слабозаметной.
                                                      0

                                                      Этот кейс — хорошая задача для того чтобы построить нейросеть и посмотреть как много различных механизмов удастся скомпрометировать.
                                                      Осталось только найти несколько миллионов номеров засвеченных кредиток

                                                        0

                                                        А что, если сначала гауссовским размытием, потом пикселизацией и опять гауссовским?

                                                          +3
                                                          А интересно, анализ размытия и применение его к картинкам позволит как-то восстановить исходное изображение? Не интерполяция, а имено восстановление, зная причину размытия.
                                                          Это как обнаружение черной дыры, зная ее влияние на соседей.

                                                          image
                                                            0
                                                            Да, позволит. И такой софт есть. На Хабре было.

                                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                          Самое читаемое