Przejdź do treści
Wróć do bloga
Framework18 sierpnia 2026 · 9 min read

Próbowaliśmy odzyskać rozmyty, spikselowany i zaczerniony tekst. Oto, co udało się odtworzyć.

Czy rozmyty tekst da się odzyskać: 92% tekstu rozmytego z sigma 4 px wróciło dokładnie w teście 480 przypadków; numer karty przed, rozmyty i odzyskany

Krótka odpowiedź: jeśli zrzut ekranu daje atakującemu to, co zrzuty ekranu zwykle dają (znaną czcionkę interfejsu, znany rozmiar tekstu, łatwy do odgadnięcia filtr), to lekkie rozmycie gaussowskie i pikselizacja małymi blokami nie są redakcją. W naszym teście na 480 przypadkach rozmycie o promieniu od 2 do 4 px zwracało oryginalny tekst dokładnie w 92-100% przypadków. Pikselizacja blokami 4 px zwracała go w 71% przypadków. „Przezroczysta” nakładka o kryciu 20% zwracała go za każdym razem. Zapisanie wyniku jako JPEG, tak jak robi to komunikator, prawie nic nie zmieniało. Jedynym zabiegiem, który nie ujawnił niczego, był jednolity, płaski prostokąt zakrywający tekst.

Reguła, która wynika z danych, jest prosta. Jeśli promień rozmycia lub blok piksela jest mniejszy niż około 0,3 rozmiaru czcionki w pikselach, załóż, że tekst da się odczytać. Przy 0,4-0,6 nadal wycieka od jednej trzeciej do połowy znaków, a w przypadku numeru karty czy klucza API to jest wyciek, a nie rozmycie. Odzysk spadał do poziomu losowego dopiero przy 0,8 i powyżej. Wtedy rozmycie jest już tak mocne, że jednolity prostokąt i tak wygląda lepiej.

Wszystko tutaj jest odtwarzalne. Kod, 480 przetworzonych obrazów i tabela wyników są opublikowane na licencji CC-BY; link na końcu.

Dlaczego to zrobiliśmy

„Nie rozmywaj, zaczerniaj” to stara rada. dheera.net uzasadnił ją w 2014 roku, Depix pokazał w 2020 roku odczytywanie spikselowanych haseł, a security.stackexchange powtarza to od dekady. Nie znaleźliśmy natomiast odpowiedzi parametrycznej: ile rozmycia wystarczy, przy jakim rozmiarze tekstu i co się dzieje, gdy obraz przejdzie przez komunikator, który go ponownie kompresuje. Ludzie dobierają promień rozmycia na oko. Chcieliśmy mieć liczby.

Metoda

Próbki. Sześć pól tego rodzaju, które faktycznie wyciekają na udostępnianych ekranach: adres e-mail, numer karty, IBAN, numer telefonu, klucz API (sk_live_...) oraz imię i nazwisko. Każde wyrenderowane w dwóch czcionkach, Arial (proporcjonalna) i Menlo (o stałej szerokości), w rozmiarach 14 px i 20 px, na ciemnym tle interfejsu, przy współczynniku pikseli 2x, czyli jak zrzut ekranu Retina. To daje 24 obrazy źródłowe.

Zabiegi, dziesięć. Rozmycie gaussowskie z sigma 2, 4, 8 i 12 px. Pikselizacja blokami 4, 8, 12 i 16 px. „Przezroczystość”: tekst narysowany z kryciem 20% na tle, co niektóre narzędzia nazywają miękką maską. Oraz jednolity prostokąt w kolorze pierwszego planu, który nazywamy redakcją. Każdy przetworzony obraz został dodatkowo zapisany jeszcze raz jako JPEG z jakością 80. 24 x 10 x 2 = 480 przypadków.

Atakujący. Założyliśmy to, co zrzut ekranu znanego produktu zdradza za darmo: czcionkę, rozmiar, położenie pola i jego zestaw znaków (cyfry dla karty, [a-z0-9._@-] dla e-maila). Atakujący zna lub zgaduje zabieg i jego siłę. Odzyskiwanie to przeszukiwanie wiązkowe po znakach: wyrenderuj kandydujący ciąg tą samą czcionką, zastosuj ten sam zabieg, porównaj z celem, zachowaj sześć najlepszych prefiksów, rozszerz o jeden znak, powtórz. To uporządkowana wersja tego, co Depix robi dla pikselizacji, i działa tak samo dla rozmycia i przezroczystości. Bez uczenia maszynowego, bez GPU. Pełny przebieg zajmuje około 25 minut na laptopie.

Ocena. Współczynnik błędów znaków (CER; 0 to idealny odzysk, 1 to nic trafionego) oraz to, czy odzyskany ciąg zgadzał się dokładnie. Redakcja jest z definicji oceniana jako CER 1,0: każdy kandydat renderuje się do tego samego płaskiego prostokąta, więc nie ma czego porównywać.

Wyniki

Według zabiegu

Wyniki według obróbki: średni współczynnik błędów znaków i odsetek dokładnych odzyskań dla przezroczystej nakładki, rozmycia sigma 2–12 px, pikselizacji 4–16 px i pełnego zaczernienia, z JPEG i bez
  • Przezroczystość (krycie 20%): średni CER 0,00 · dokładny odzysk 100% · po JPEG q80 0,00 / 100%
  • Rozmycie sigma 2 px: średni CER 0,00 · dokładny odzysk 100% · po JPEG q80 0,00 / 100%
  • Rozmycie sigma 4 px: średni CER 0,03 · dokładny odzysk 92% · po JPEG q80 0,10 / 88%
  • Pikselizacja 4 px: średni CER 0,11 · dokładny odzysk 71% · po JPEG q80 0,11 / 71%
  • Pikselizacja 8 px: średni CER 0,49 · dokładny odzysk 8% · po JPEG q80 0,49 / 8%
  • Rozmycie sigma 8 px: średni CER 0,57 · dokładny odzysk 21% · po JPEG q80 0,64 / 17%
  • Pikselizacja 12 px: średni CER 0,63 · dokładny odzysk 21% · po JPEG q80 0,63 / 21%
  • Pikselizacja 16 px: średni CER 0,83 · dokładny odzysk 0% · po JPEG q80 0,84 / 0%
  • Rozmycie sigma 12 px: średni CER 0,84 · dokładny odzysk 4% · po JPEG q80 0,87 / 0%
  • Jednolita redakcja: średni CER 1,00 · dokładny odzysk 0% · po JPEG q80 1,00 / 0%

Przezroczysta nakładka zaskoczyła nas najmniej, a niepokoi najbardziej. Rysowanie tekstu z kryciem 20% to po prostu rysowanie go z mniejszym kontrastem. Korekta poziomów przywraca go, a nasze przeszukiwanie trafiło wszystkie 48 przypadków. Niektóre narzędzia do zrzutów ekranu oferują to jako tryb prywatności. Nie jest nim.

Lekkie rozmycie i małe piksele są w pełni odwracalne. Rozmycie sigma 2 i sigma 4 oraz pikselizacja 4 px zwracały tekst w większości przypadków. Nie w przybliżeniu. Dokładnie.

JPEG Cię nie uratuje. Ponowna kompresja dodała kilka błędów w przypadku sigma 4 i nie zmieniła niczego dla pikselizacji: bloki są duże i płaskie, a to jest dokładnie to, co JPEG dobrze zachowuje.

Według siły względem rozmiaru tekstu

Mapa ciepła odsetka dokładnych odzyskań według rozmiaru rozmycia lub bloku pikseli podzielonego przez rozmiar czcionki: 100% poniżej 0,2, 83% rozmycie i 50% pikselizacja przy 0,3, blisko zera od 0,8

Wartości bezwzględne zależą od rozmiaru czcionki, więc użyteczniej jest odczytywać je jako stosunek sigma rozmycia (lub bloku piksela) do rozmiaru czcionki w pikselach:

  • do 0,2: rozmycie: średni CER / dokładny 0,00 / 100% · pikselizacja: średni CER / dokładny 0,01 / 92%
  • około 0,3: rozmycie: średni CER / dokładny 0,07 / 83% · pikselizacja: średni CER / dokładny 0,20 / 50%
  • około 0,4: rozmycie: średni CER / dokładny 0,37 / 33% · pikselizacja: średni CER / dokładny 0,42 / 8%
  • około 0,6: rozmycie: średni CER / dokładny 0,80 / 8% · pikselizacja: średni CER / dokładny 0,40-0,56 / 8-42%
  • 0,8 i powyżej: rozmycie: średni CER / dokładny 0,87 / 0% · pikselizacja: średni CER / dokładny 0,80-0,87 / 0%

Poniżej około 0,3 tekst wraca. Między 0,4 a 0,6 wraca częściowo, a „częściowo” to niebezpieczny obszar: w 46% przebiegów pikselizacji 8 px i 33% przebiegów rozmycia sigma 8 co najmniej połowa znaków była poprawna. Połowa numeru karty albo pierwszych dwanaście znaków aktywnego klucza API to nie jest prywatność. Dopiero przy 0,8 i powyżej wyniki były bliskie losowym (dla pola złożonego wyłącznie z cyfr poziom losowy to CER około 0,9).

Czcionki o stałej szerokości i duży tekst są łatwiejsze do odzyskania

Jeden numer karty w czterech obróbkach i co odzyskał atakujący: rozmycie sigma 4 i przezroczystość 20% w całości, pikselizacja 8 px w połowie, pełne zaczernienie nic

Menlo w rozmiarze 20 px z pikselizacją 12 px, czyli blokami większymi niż połowa wysokości tekstu, nadal wracało z CER 0,02. Czcionki o stałej szerokości dają przeszukiwaniu siatkę; większy tekst daje każdemu znakowi więcej pikseli, w których zostawia swój ślad. To ma znaczenie, bo terminale, IDE, przeglądarki logów i większość tabel administracyjnych używają dokładnie tej kombinacji.

Według pola

Numery kart były najłatwiejszym celem (średni CER 0,22, 64% dokładnych trafień w zabiegach rozmycia, pikselizacji i przezroczystości, bez JPEG): alfabet z dziesięciu symboli i stała długość. Adresy e-mail i klucze API były najtrudniejsze, z CER około 0,47, bo przestrzeń przeszukiwania na znak jest większa. „Najtrudniejsze” nadal oznaczało, że 36% z nich wróciło dokładnie.

Co to oznacza w praktyce

Zaczerniaj, nie rozmywaj, gdy liczy się treść. Jednolity prostokąt był jedynym zabiegiem w tym teście, który nie ujawnił niczego, w każdej czcionce, rozmiarze i kompresji. Jest też jedynym, którego bezpieczeństwo nie zależy od parametru, który musisz dobrze ustawić.

Jeśli musisz rozmywać, rób to mocno i dopasuj do tekstu: sigma co najmniej 0,8 rozmiaru czcionki lub bloki pikseli co najmniej 0,8 rozmiaru czcionki. Liczy się stosunek, a nie bezwzględna liczba pikseli; mierz oba w tych samych jednostkach. Dla czcionki interfejsu 14 px to sigma 11 px lub więcej, czyli znacznie więcej niż jakiekolwiek ustawienie domyślne.

Nigdy nie ufaj kryciu. Przezroczysta nakładka to zmiana koloru, a nie usunięcie.

Nie licz na to, że komunikator dokończy robotę. Ponowna kompresja JPEG zostawiła pikselizację nietkniętą, a rozmycie prawie nietknięte.

Najbezpieczniejsze rozmycie to takie, które nigdy nie trafia na ekran. Wszystko, co zostało zamaskowane po przechwyceniu, można zaatakować na podstawie przechwyconych pikseli. Ukrycie wartości, zanim zostanie narysowana, na stronie, zanim zacznie się udostępnianie lub nagrywanie, usuwa piksele, których atak potrzebuje. Takie podejście stosuje DataBlur i właśnie dlatego przeprowadziliśmy to badanie.

Ograniczenia

To atakujący znający czcionkę i zabieg. Jest to realistyczne dla zrzutów ekranu popularnych interfejsów, gdzie czcionka i rozmiar są publiczne, ale nietypowa czcionka podnosi poprzeczkę. Nie usuwa jej; atakujący nadal może wypróbować prawdopodobnych kandydatów.

Dwie czcionki, dwa rozmiary, jedno tło. Jasne motywy, różnice w wygładzaniu i renderowanie subpikselowe zmienią liczby. Nie spodziewamy się, by znacząco przesunęły progi, ale tego nie zmierzyliśmy.

Brak rzeczywistych zakłóceń poza JPEG q80. Żadnych zdjęć ekranu telefonem, żadnej kompresji wideo. Kodeki wideo to osobne badanie.

Atak to proste przeszukiwanie wiązkowe. Istnieją lepsze ataki (wyuczone rozkłady a priori, szersze wiązki, ograniczenia słownikowe dla e-maili i nazwisk). Nasze liczby to dolna granica tego, co może zrobić atakujący, a nie górna.

Ocenialiśmy odzysk tekstu, którego atakujący się spodziewa. Ukryty tekst o nieznanej długości jest trudniejszy do zlokalizowania, choć ramka pola i tak jest zwykle widoczna na rozmytym obrazie.

Dane i kod

Wszystkie 480 przetworzonych obrazów, tabela wyników (results.csv) i skrypt eksperymentu (experiment.py, Python z Pillow i NumPy) są opublikowane pod adresem github.com/yochef17/blur-recovery-study na licencji CC BY 4.0. Ponowne uruchomienie pełnej macierzy zajmuje około 25 minut na laptopie. Jeśli rozszerzysz badanie o więcej czcionek, jasne motywy lub wideo, daj nam znać: support@datablur.app.

Opublikowane przez DataBlur. DataBlur to rozszerzenie przeglądarki, które rozmywa lub zaczernia wrażliwe dane na stronie, zanim zostanie ona udostępniona lub nagrana. Przeprowadziliśmy to badanie, żeby sprawdzić, na ile słowo „rozmywa” w tym zdaniu cokolwiek chroni. Żaden z wniosków nie zależy od produktu.