Za niecałe dwa tygodnie Unia Europejska zacznie stosować Unijne Certyfikaty Covid zwane także paszportami covidowymi albo unijnymi cyfrowymi zaświadczeniami Covid (EU Digital COVID Certificates). Co jest zapisane w QR-kodzie, który znajduje się w tym dokumencie? Jak możemy to sami sprawdzić? W tym artykule rozbieramy temat na czynniki pierwsze. Roześlijcie link znajomym, którzy obawiają się zaświadczeń i panikują, że zawartość jest zakodowana, nieczytelna a rząd na pewno coś ukrywa.
Dzięki certyfikatom covidowym, zgodnym z rozporządzeniem Parlamentu Europejskiego, od początku lipca 2021 osoby zaszczepione, przetestowane i ozdrowiałe będą mogły przemieszczać się po Unii Europejskiej bez konieczności odbywania izolacji i kwarantanny. Jest to coś zupełnie co innego, niż wycofane z użycia rodzime zaświadczenia o szczepieniach. Tym razem nie ma mowy o częściowej anonimizacji danych, certyfikat covidowy zawiera imię, nazwisko i datę urodzenia. Co jeszcze powinniśmy wiedzieć?
Inne teksty związane z epidemią koronawirusa
[13.03.2020] o projekcie „Stop the pandemic” i tym, że jego autorzy prosili o znacznie więcej danych niż powinni
[20.03.2020] w którym zaglądam do środka aplikacji „Kwarantanna Domowa” i opisuję, co znalazłem w środku
[29.03.2020] w którym opisuję dlaczego smartfony nie bardzo nadają się do śledzenia interakcji między ludźmi
[03.04.2020] w którym piszę o zapowiadanej przez Ministerstwo Cyfryzacji apce „ProteGO” i o tym, że nie zadziała ona zgodnie z oczekiwaniami
[21.04.2020] w którym piszę o protokole Contact Tracing autorstwa Apple+Google i projekcie OpenTrace
[26.04.2020] w którym opowiadam, jak można sprawdzić, co robi aplikacja mobilna i dlaczego otwarte źródła to nie wszystko
[29.04.2020] w którym mając umowę szacuję koszty napisania od zera aplikacji Kwarantanna Domowa
[09.05.2020] w którym pokazuję, jak sprawdzić zawartość komunikatów wysyłanych w eter przez ProteGO Safe
[04.06.2020] w którym opisuję kontrowersyjną architekturę aplikacji ProteGO Safe 4.1.0-rc.1
[16.07.2020] w którym pokazuję, że aplikacja ProteGO nie działa
[31.08.2020] w którym podaję statystyki ProteGO Safe u progu nowego roku szkolnego
[27.10.2020] w którym podaję statystyki STOP COVID (dawniej ProteGo Safe) przed Wszystkich Świętych
[05.11.2020] w którym opisuję, co będzie, jeśli apka STOP COVID (dawniej ProteGo Safe) stanie się obowiązkowa
[29.01.2021] w którym opisuję, jaką niespodziankę sprawiła aplikacja mobilna „Zaszczepieni”
[18.06.2021] w którym opisuję Unijne Certyfikaty Covidowe i aplikację „UCC – Unijny Certyfikat Covid”
Na tym blogu nie boimy się wchodzenia w technikalia. Nigdy nie jest tak technicznie, aby nie mogło być bardziej technicznie. Rozumiem jednak, że dla osób spoza IT śledzenie tekstu może być trudne, więc proponuję następujący układ – jeśli przestajesz rozumieć, o czym mowa, przeskocz do następnego rozdziału.
Wcześniejsze teksty przydatne w lekturze tego artykułu
Poniżej wskazuję wcześniejsze teksty publikowane na blogu, które mogą pomóc w zrozumieniu zagadnień przywoływanych w niniejszym artykule:
- artykuł o kodowaniu BASE64, tłumaczący sposób przechowywania dowolnych plików w takiej postaci, aby zapis korzystał jedynie z literek i cyferek
- artykuł o QR-kodach, zawierający najobszerniejszy w języku polskim opis tego, jak czarno-białe kombinacje kwadracików kodują litery i cyfry
- artykuł o aplikacji „Zaszczepieni” i tych zaświadczeniach z QR-kodami, które były w użyciu między styczniem a czerwcem 2021 – opis formatu, zawartości i metod dekodowania.
Jak powstaje QR-kod z certyfikatu covidowego?
Sięgnijmy do dokumentu Guidelines on Technical Specifications for Digital Green Certificates w wersji 1.3 z 21 kwietnia 2021. Znajduje się tam następująca ilustracja tworzenia QR-kodu, którą opatrzyłem przypisami:
Szablon dokumentu (1) jest wypełniany danymi o konkretnej osobie (2) przez instytucję zdrowotną, powstaje dokument w formacie JSON (3) który jest dla oszczędności miejsca przekształcany w postać binarną CBOR (4), podpisywany kluczem prywatnym przez co powstaje paczka w formacie COSE (5) która jest następnie kompresowana (6) algorytmem ZLib Deflate. Skompresowane dane są kodowane protokołem BASE45 (7) i w takiej postaci trafiają do QR-kodu (7).
Dekodujemy zawartość paszportu covidowego!
Aby odczytać zawartość QR-kodu, musimy wymienione wyżej operacje przeprowadzić od końca, czyli: odczytać napis z obrazka, zdekodować BASE45, zdekompresować Zlib Deflate, zdekodować COSE i CBOR, wtedy dostaniemy zestaw napisów, które będziemy mogli zinterpretować zgodnie ze źródłowym schematem JSON.
Wszystko to robi oczywiście jednym kliknięciem aplikacja „UCC – Unijny Certyfikat COVID”, ale jest ona swego rodzaju czarną skrzynką, której zasad działania nie znamy. My przeprowadzimy te same operacje ręcznie, kontrolując etapy pośrednie i sprawdzając, jak zmienia się postać danych przenoszących zapisy paszportu covidowego.
Podstawowym narzędziem będzie CyberChef. Z wersji online można skorzystać tutaj ale nie musimy się obawiać ujawnienia światu sekretów – dostępna jest też wersja do pobrania, uruchamiana lokalnie bez użycia internetu.
Krok 1 – odczytujemy QR-kod
Na potrzeby niniejszego artykułu wykorzystamy testowe QR-kody dostępne na tej stronie
Uwaga! QR-kody tam obecne nie przejdą weryfikacji aplikacją i jest to stan oczekiwany, bo podpisane są testowym certyfikatem. To ułatwia zadanie programistom i integratorom systemów, którzy mogą tworzyć QR-kody o błędnej zawartości i sprawdzać, jak ich oprogramowanie poradzi sobie z usterkami.
Otwórzmy CyberChefa i przeprowadźmy następujące kroki:
- w palecie po lewej stronie wybieramy pozycję „Other” → „Parse QR Code” albo przywołujemy ją za pomocą filtra tekstowego
- przeciągamy niebieską ramkę „Parse QR Code” do „Przepisu” („Recipe”)
- w ramce na dane wejściowe („Input”) klikamy ikonkę ładowania pliku, wybieramy obrazek albo zdjęcie z QR-kodem
- w ramce „Input” pojawia się podgląd wczytanego pliku
- w ramce na dane wyjściowe („Output”) pojawia się napis stanowiący zdekodowaną treść QR-kodu
Zdekodowany napis będzie się składał z cyfr, wielkich liter, kilku znaków specjalnych i… spacji. Okienko tekstowe złamie linie w miejscu w którym występują spacje, ale uwaga! Mają one znaczenie, nie można ich kasować. Zdekodowany napis nie ma znaków przejścia do nowej linii, w naszym przypadku wygląda następująco:
Znaki „HC1:” (Health Certificate wersja 1) muszą zostać usunięte przed dalszym przetwarzaniem, ten prefiks służy wyłącznie do określenia wersji ładunku oraz potwierdzenia, że QR-kod faktycznie zawiera certyfikat covidowy.
Krok 2 – dekodujemy BASE45
W przywołanym wcześniej artykule opisałem, jak trzy bajty przekazu do zakodowania standardem BASE64 przekształcane są na cztery znaki tworzące wiadomość. Efektywność kodowania BASE45 jest niższa, tutaj dwa bajty kodowane są trzema znakami. Skąd pomysł, by go użyć?
Jak napisano w specyfikacji certyfikatów covidowych, użycie kodowania alfanumerycznego ma poprawić zgodność ze starszymi komponentami, które pracują tylko z 7-bitowym zbiorem znaków ASCII. Moim zdaniem byłaby to znakomita okazja, aby takie systemy lub urządzenia odesłać na emeryturę – jeśli rzeczywiście gdzieś występują. Wskazana korzyść jest zresztą iluzoryczna, krok później i tak będziemy mieli do czynienia z danymi binarnymi.
Aby było jasne – nie tracimy na efektywności, bo kodowanie BASE45 korzysta z dokładnie tych samych 45 znaków, które zawiera alfanumeryczny tryb QR-kodów. W tym trybie potrzebujemy 11 bitów (pikseli w QR-kodzie) do zapisania dwóch takich znaków albo 33 bitów do zapisania sześciu takich znaków. Mamy więc raptem jeden bit poniżej optymalnego upakowania, w trybie binarnym QR-kodów zapis czterech bajtów zająłby dokładnie 32 bity.
CyberChef nie obsługuje sam z siebie kodowania BASE45, ale nic nie stoi na przeszkodzie, by przygotować przepis przeprowadzający krok po kroku wszystkie obliczenia (tutaj specyfikacja z potrzebnymi informacjami). To właśnie zrobiłem – podlinkowanego przepisu użyjemy do zdekodowania napisu otrzymanego w poprzednim kroku (pamiętamy o usunięciu prefiksu).
Zgodnie z oczekiwaniami, na wyjściu otrzymujemy nieczytelną reprezentację pliku binarnego. Aby upewnić się, że wszystko idzie dobrze, możemy na chwilę wstawić na koniec przepisu operację „Detect file type” i upewnić się, że widzimy format Zlib Deflate. Potem usuwamy tę operację.
Krok 3 – dekompresujemy Zlib Deflate
Krótko i zwięźle – na koniec przepisu z poprzedniego kroku wstawiamy operację Zlib Inflate.
Na wyjściu otrzymujemy trochę inną kaszę, w której zauważamy fragmenty napisów „Centrum e-Zdrowia” czy „STANISLAW”. To sugeruje, że jesteśmy na dobrej drodze.
Krok 4 – rozkodowujemy COSE
COSE to skrót od „CBOR Object Signing and Encryption” – formatu kontenera, w którym przechowywane są podpisane cyfrowo obiekty CBOR. Charakterystyczne jest jednak, że COSE sam używa formatu CBOR, więc na koniec przepisu z poprzedniego kroku wstawiamy operacje „CBOR Decode” oraz – dla czytelności – „JSON Minify”. Oto wynik:
W ramce z danymi wyjściowymi zaznaczyłem elementy formatu CBOR: nagłówek definiujący format podpisu cyfrowego (kolor żółty), ładunek główny z certyfikatem covidowym (kolor zielony) oraz podpis cyfrowy złożony przez wystawcę certyfikatu (kolor niebieski).
Uwaga – w niniejszym tekście pomijamy temat weryfikacji prawidłowości podpisu oraz certyfikatu. Zainteresowany czytelnik znajdzie potrzebne narzędzia i materiały tutaj, tutaj oraz tutaj. I jeszcze tutaj.
Zakładamy tym samym w ciemno, że z podpisem wszystko jest w porządku i możemy iść dalej.
Krok 5 – rozkodowujemy CBOR
W tym kroku napotkamy problem. Format JSON daje się zawsze przełożyć na CBOR, ale w drugą stronę niekoniecznie – CyberChef spróbuje i zawiedzie. Mówiąc precyzyjniej, CBOR pozwala na mapowanie (indeksowanie) obiektów liczbami, JSON jedynie napisami. Dekodowanie CBOR będzie więc wymagało innego narzędzia.
Przekształcimy teraz dane do szesnastkowego zapisu obiektu CBOR. W nowym oknie CyberChefa wklejamy dane z poprzedniego kroku, potem tworzymy przepis z następującym operacjami:
- „JPath expression” z dyrektywą
$.value[2].data.*
– aby wyciąć tablicę liczb składającą się na certyfikat covidowy, tę oznaczoną na zielono - „From Decimal” – aby zamienić liczby na bajty, separator: Line feed
- „To hex” – aby zamienić bajty na zapis szesnastkowy, separator: Space
W okienku wyjściowym mamy zestaw liczb w zapisie szesnastkowym, kopiujemy je, wklejamy do prawej ramki na stronie cbor.me i klikamy przycisk ze strzałką w lewo:
Nareszcie! W ramce po lewej widzimy w końcu zawartość certyfikatu covidowego.
Tu szybka informacja dla tych, który samodzielnie budują system weryfikacji QR-kodów i coś im nie działa – tutaj można znaleźć zestaw przypadków testowych (pozytywnych i negatywnych) z danymi wejściowymi i wyjściowymi do każdego kroku przekształceń. Ja użyłem wzorcowych danych do wytropienia usterek w swoim dekoderze BASE45.
Zawartość certyfikatu covidowego
Nasz przykładowy certyfikat wygląda następująco:
W węźle o indeksie „1” znajduje się oznaczenie kraju, indeks „6” to data wydania certyfikatu (w formacie Unix, 1621893600 to północ 25 maja 2021), „4” to data ważności (tutaj: 18 marca 2022) zaś pod indeksem „-260” znajduje się blok informacji o osobie dla której wystawiono certyfikat i jej sytuacji zdrowotnej. W dalszej części zajmiemy się tylko tym blokiem, którego wersję 1.3.0 opisano w dokumencie Technical Specifications for EU Digital COVID Certificates.
Dane osobowe
Osoba, której dotyczy certyfikat covidowy, jest identyfikowana wyłącznie przez imię, nazwisko i datę urodzenia. Dane osadzone w QR-kodzie nie zawierają polskiego numeru PESEL ani serii/numeru dokumentu tożsamości. Trzeba jednak pamiętać, że identyfikator szczepienia lub testu da się powiązać z konkretnym człowiekiem.
Ciekawostka – imię i nazwisko występuje w dwóch formach. Pierwsza korzysta ze wszystkich liter alfabetu narodowego, nazwisko zapisane jest jako seria znaków Unicode. Druga zawiera transkrypcję łacińską w takiej postaci, w jakiej występuje ona w dokumencie ICAO 9303 opisującym obszar do odczytu maszynowego w paszportach i innych dokumentach podróżnych.
Sytuacja zdrowotna
Certyfikat covidowy musi zawierać dokładnie jedną z trzech możliwych sekcji opisujących stan zdrowia – informację o zaszczepieniu, o przebytej chorobie lub o wynikach testu.
Informacja o szczepieniu
Blok z informacjami o odbytym szczepieniu zawiera szeroki zestaw informacji opisujących szczepionkę i stan zaszczepienia. Wartości opisujące niektóre pozycje są całkowicie nieczytelne bez klucza, ale tak jest lepiej – dokument Value Sets for Digital Green Certificates odsyła nas gdzie trzeba, my zaś unikamy tworzenia nowych słowników.
Komplet pól w tej sekcji wygląda następująco:
- „tg” – kod choroby, zawsze 840539006 (COVID-19)
- „vp” – typ szczepionki (np. 1119349007 to szczepionka mRNA)
- „mp” – produkt leczniczy, kod konkretnego lekarstwa (np. EU/1/20/1528 to Comirnaty)
- „ma” – producent (np. ORG-100030215 to Biontech Manufacturing GmbH)
- „dn” – numer przyjętej dawki
- „sd” – liczba dawek w kuracji
- „dt” – data przyjęcia ostatniej dawki
- „co” – kraj w którym podano szczepionkę
- „is” – wystawca certyfikatu (w Polsce – Centrum e-Zdrowia)
- „ci” – identyfikator certyfikatu w formacie przyjętym przez dany kraj
Informacja o przebytej chorobie
Ważność certyfikatu z blokiem opisującym przebytą chorobę nie może zaczynać się wcześniej niż 11 dni po dacie pozytywnej diagnozy ani kończyć później niż 180 dni od tej daty.
Komplet pól w tej sekcji wygląda następująco:
„tg” – kod choroby, zawsze 840539006 (COVID-19)
„fr” – data pierwszego testu, który dał wynik pozytywny
„co” – kraj w którym wykonano test
„is” – wystawca certyfikatu (w Polsce – Centrum e-Zdrowia)
„df” – początek ważności certyfikatu, nie wcześniej niż „fr + 11 dni”
„du” – koniec ważności certyfikatu, maksymalnie „fr + 180 dni”
„ci” – identyfikator certyfikatu w formacie przyjętym przez dany kraj
Informacja o przeprowadzonym teście
Blok z informacjami o wynikach przeprowadzonego testu nie zaskakuje:
- „tg” – kod choroby, zawsze 840539006 (COVID-19)
- „tt” – typ testu
- „nm” / „ma” – nazwa testu molekularnego albo identyfikator testu antygenowego
- „sc” – data i godzina pobrania próbki
- „tr” – wynik testu (260415000 = nie wykryto wirusa, 260373001 = wykryto wirusa)
- „tc” – jednostka wykonująca test
- „co” – kraj w którym przeprowadzono test
- „is” – wystawca certyfikatu (w Polsce – Centrum e-Zdrowia)
- „ci” – identyfikator certyfikatu w formacie przyjętym przez dany kraj
Weryfikowanie certyfikatu covidowego aplikacją mobilną
QR-kod z certyfikatem covidowym można zweryfikować w aplikacji mobilnej „UCC – Unijny Certyfikat Covid” (dawniej „Zaszczepieni”) dostępnej na Androida i iOS. O poprzednim wcieleniu apki pisałem w tym artykule. Nowa wersja ma taki sam przaśny interfejs użytkownika, jednak tym razem nie ukrywa informacji o identyfikatorze szczepienia, prezentuje też – zamiast inicjałów – pełne imię i nazwisko.
Inaczej jest w aplikacji włoskiej (po prawej stronie) – ta pokazuje tylko imię, nazwisko, datę urodzenia i status weryfikacji certyfikatu. Przywołałem ją tu by zwrócić uwagę na interoperacyjność, aplikacje z różnych krajów europejskich potrafią potwierdzać „obce” certyfikaty covidowe. Swoje klucze publiczne dostarczają wszystkie współpracujące organizacje zdrowotne.
Podsumowanie
W ostatnim czasie nieco ucichła debata na temat tego, do jakiego stopnia pandemia usprawiedliwia dyskryminację osób niezaszczepionych. „Unijny Certyfikat Covid ma ułatwić swobodne podróżowanie obywatelom Unii Europejskiej podczas pandemii” – informuje portal rządowy, jednak przyjęcie szczepionki zwalnia z wielu lokalnych ograniczeń (np. limitu osób na imprezach masowych). Czy wkrótce QR-kody będą sprawdzane przy kupowaniu biletów z puli „dla zaszczepionych”?
W czasopiśmie Lege Artis Olgierd Rudak pochyla się nad podobnymi pytaniami: „czy dopuszczalne jest przetwarzanie danych o zaszczepieniu przeciwko COVID-19 przez usługodawców, których obowiązują limity w przyjmowaniu klientów? Czy można żądać okazania zaświadczenia o szczepionce?”
Jego odpowiedź to stanowcze i zdecydowane „być może”. Tyle na razie wystarcza. Jeśli dzięki szczepieniom zbudujemy odporność populacyjną a po wakacjach nie będzie kolejnej fali zachorowań, temat pewnie spadnie z nagłówków. W przeciwnym razie musimy się liczyć z tym, że Unijne Certyfikaty Covid staną się elementem codziennego życia.
O autorze: zawodowy programista od 2003 roku, pasjonat bezpieczeństwa informatycznego. Rozwijał systemy finansowe dla NBP, tworzył i weryfikował zabezpieczenia bankowych aplikacji mobilnych, brał udział w pracach nad grą Angry Birds i wyszukiwarką internetową Microsoft Bing.
40 odpowiedzi na “Co zawierają QR-kody w Unijnym Certyfikacie Covid i jak to sprawdzić?”
Dzięki za (jak zawsze) wartościowy materiał!
Drobna poporawka: link do pobrania CyberChefa w artykule nie działa. Poprawny adres to: https://github.com/gchq/CyberChef/releases
Pozdrawiam 🙂
Poprawiłem, dzięki!
Jak zawsze na wysokim poziomie, brawo!
Proszę tylko poprawić link do pobrania CyberChef prawidłowy to https://github.com/gchq/CyberChef/releases
Bardzo ciekawie sie czyta te artykuły nawet jesli nie ma sie duzego doswiadczenia w ITsec, oby wiecej tego typu rzeczy! Może coś o serwisach streamingowych i jak działają?
Tam były jakieś zmiany – przynajmniej w wersji tekstowej certyfikatu Covid’owego UE – w zakresie daty ważności. Z tego co wiem najpierw była data ważności (np. dla szczepienia 1 rok), później to zmieniono na „datę ważności w Polsce”, a później wcale to usunięto.
Data ważności dalej jest, na poziomie metadanych certyfikatu i można to łatwo sprawdzić w dokumentach źródłowych udostępnianych przez UE:
https://ec.europa.eu/health/sites/default/files/ehealth/docs/vaccination-proof_interoperability-guidelines_en.pdf
Strona 11. Mamy tam wyszczególnione takie pola jak:
a) „Certificate valid from”
b) „Certificate valid to”
c) „Next vaccinatio date” (to jeszcze nie wisienka na torcie która będzie dalej)
Wisienką na torcie jest: „SUPRISE, SUPRISE” możliwość natychmiastowego unieważnienia certyfikatu w dowolnym momencie:
„Provide support for additional features, such as the revocation of issued certificates”
Mechanizm praktycznie identyczny jak unieważnienie certyfikatów SSL dla stron internetowych. Tutaj jednak zastosowany do ludzi, tzn. twojego certyfikatu przywilejów.
Taki świat szykują nam i naszym dzieciom.
„Mechanizm praktycznie identyczny jak unieważnienie certyfikatów SSL dla stron internetowych. Tutaj jednak zastosowany do ludzi, tzn. twojego certyfikatu przywilejów.”
Tego nie rozumiem. Jeśli wycieknie prywatna część klucza SSL, to każdy może podszywać się pod daną witrynę. Wówczas trzeba certyfikat unieważnić (aby przerwać możliwy atak) i wystawić nowy (aby znów było bezpiecznie). Podobnie jest z podpisywaniem paszportów covidowych – w razie skompromitowania certyfikatu zostanie wystawiony nowy a Ty dostaniesz nowego PDF-a z nowym QR-kodem.
To zabawne obserwować skrajną naiwność ludzi. A więc jesteś pewien, że mechanizm unieważnienia certyfikatu będzie używany tylko w razie skompromitowania certyfikatu? To tak samo jakby twierdzić, że proch i dynamit będzie używany wyłącznie w górnictwie i budownictwie i żaden rząd, organizacja, czy człowiek nie użyje ich w celu wyrządzenia krzywdy innym ludziom. No, doprawdy, przenikliwość 5-latka.
Skala rażenia takiego unieważnienia byłaby wyjątkowo niewielka, bo po pierwsze mechanizm jest nieprzećwiczony i wiele zagranicznych aplikacji weryfikujących nigdy nie wdroży listy odwołań, po drugie zaś nawet w przypadku wdrożenia prawdopodobnie odrzucane byłyby paszporty wystawione po dacie odwołania. W świetle powyższego – oraz faktu, że raportowane w prasie „podrobione” paszporty były w rzeczywistości fałszywie poświadczonymi szczepieniami z prawdziwym paszportem – oraz faktu, że jednakowo szkodziłoby to „naszym” i „onym” – tak, jestem przekonany że unieważnianie się nie przydarzy.
Tzn. jak ktoś jakimś cudem, podrobi klucz prywatny i będzie sobie podpisywał lewe zaświadczenia tym certyfikatem, i to wyjdzie na jaw to oni uwalą wszystkie wcześniej wydane? I co w takich okolicznościach?
Musiałby ukraść, podrobić się nie da
Co to dokładnie znaczy ukraść, „przerobić” co kogoś certyfikat na swój?
No to chyba właśnie ukradł: https://www.bleepingcomputer.com/news/security/eu-investigating-leak-of-private-key-used-to-forge-covid-passes/
Na szczęście klucze nie zostały wykradzione, natomiast odkryto metodę na nieuprawniony dostęp do API usługi wystawiającej certyfikaty covidowe. Dlatego właśnie certyfikaty Hitlera czy Myszki Miki miały fałszywe dane osobowe ale prawidłowy dzień wystawienia, posiadacz wykradzionego klucza mógłby wygenerować np. certyfikat z przyszłości.
Pewnie dobre parę godzin poszło na takie rozgryzanie tematu… Szanuję i podziwiam.
Jakiś czas temu napisałem sobie skrypt w pythonie, który rozkodowuje te certyfikaty: https://gist.github.com/yaci/96b53642bacfe440949cbc781bb479b1
Opakowałem go też w dockera: https://hub.docker.com/r/yaci/eu-covid-cert-qr-decoder.
Na posta na blogu zabrakło mi chęci (i własnego bloga ;P). Kudos za Twój write up, nie wiedziałem że da się całość rozkodować przy pomocy narzędzi online.
A w drugą stronę zrobisz? 😉
W tekście masz podlinkowane narzędzia, które robią w drugą stronę od początku do końca
Witam
o które linki dokładnie chodzi, bo nie mogę tego zidentyfikować
Nasze UODO oficjalnie odpowiedziało na pytanie na końcu.
NIE, nie wolno pytac o certyfikat i jesli osoba sama go nie pokaze nie można wymuszać, przetważać ani go przechowywać
zatem nie masz racji w tym konkretnym stanowcze być może 😉
„Tym samym nie mają one prawa żądać podania od nich takich danych, a osoba, której dane dotyczą, nie ma obowiązku ich podania.”
UODO: https://uodo.gov.pl/pl/138/2088
Powitać. Żądać nie mają, nie zmienia to jednak sytuacji, że zapięczętowani będą sami z chęcią tym kodem świecić. I bardzo łatwo ominą ten przepis, np ustawiając dwie kolejki np do wejścia, przy czym jedna będzie dla zapieczętowanych poprzez zeskanowanie kodu przez maszynę. Proste. Po to są utrzymywane limity.
Wtedy mówimy o tzw. dyskryminacji pozytywnej, również zakazanej. Wymuszenie takowej jest przestępstwem zgodnie z art. 107 ustawy o ochronie danych osobowych.
Odczytanie danych z przedstawionego certyfikatu nie jest przetwarzaniem danych osobowych.
Art. 7 pkt 2 ustawy z dnia 29 sierpnia 1997 r. o ochronie danych osobowych (Dz. U. Nr 133, poz. 883 ze zm.; dalej: u.o.d.o.), zgodnie z którym przetwarzanie danych to jakiekolwiek operacje wykonywane na danych osobowych, takie jak: zbieranie, utrwalanie, przechowywanie, opracowywanie, zmienianie, udostępnianie i usuwanie, a zwłaszcza te, które wykonuje się w systemach informatycznych.
Przeglądanie danych jak najbardziej zalicza się do przetwarzania.
https://gdpr.pl/baza-wiedzy/akty-prawne/interaktywny-tekst-gdpr/artykul-4-definicje
https://uodo.gov.pl/file/641
https://ec.europa.eu/info/law/law-topic/data-protection/reform/what-constitutes-data-processing_pl
Termin „przetwarzanie” oznacza szereg różnych operacji wykonywanych na danych osobowych w sposób zautomatyzowany lub ręczny. Obejmuje takie działania jak zbieranie, utrwalanie, organizowanie, porządkowanie, przechowywanie, adaptowanie lub modyfikowanie, pobieranie, przeglądanie, wykorzystywanie, ujawnianie poprzez przesłanie, rozpowszechnianie lub innego rodzaju udostępnianie, dopasowywanie lub łączenie, ograniczanie, usuwanie lub niszczenie danych osobowych.
Ogólne rozporządzenie o ochronie danych (RODO) ma zastosowanie do przetwarzania danych osobowych w sposób całkowicie lub częściowo zautomatyzowany oraz do przetwarzania w sposób inny niż zautomatyzowany danych osobowych stanowiących część uporządkowanego zbioru danych.
Bardzo ciekawy artykuł, zacząłem weryfikację zaczynając od mojego kodu ze szczepienia i niestety nie przeszedłem 2go kroku dostaje błąd Zlib Inflate – invalid fcheck flag:14
Sprawdziłem też kod testowy i też nie da się przejść 2go kroku.
Czy ktoś ma pomysł co robię źle lub gdzie może tkwić problem?
Spróbuj dodać znak nowej linii na końcu danych wejściowych, bez tego konwerter chyba nie działa do końca poprawnie
Masz na myśli „\n” ?
Mam dokładnie to samo.
„że identyfikator szczepienia lub testu da się powiązać z konkretnym człowiekiem”
Możesz rozszerzyć temat? Albo odesłać do źródłowej informacji?
Od paru dni się zastanawiałem jak kiniarz lub restaurator będą weryfikowali czy dana osoba pokazuje w smartfonie lub jako wydruk papierowy swój paszport covidowy. Oba to QR==obrazki nieczytelne dla człowieka. Łatwo oba spreparować. Minister jakoś nie informuje o właściwej aplikacji.
Brawo, jak zwykle, za dobry artykuł
Świetny artykuł, dziękuję i szacunek za umiejętności 🙂
Hej. Fajnie opisane, ale ja mam problem z datą ważności, mój certyfikat ma zapisane że jest to 2023-05-26, kiedy ostatnią dawkę miałem 2021-02-15. Zastanawiam się czy aby na pewno te daty są dobrze podane. Co może być przyczyną takiego rozjazdu?
Ps. znacie jakieś narzędzie online, gdzie mogę wrzucić QR i zobaczyć co siedzi w środku?
Czy ktoś wie jaki jest PublicKey Certificate dla Polski?
I skąd się biorą klucze prywatne?
Czyli tym sposobem można podmienić dane I wygenerować nowy kod qr na kogoś innego ?? Niezle
Nie można. Tzn. można, ale bez znajomości klucza prywatnego nie wygenerujesz podpisu, dzięki któremu możliwa będzie poprawna weryfikacja takiego QR-kodu.
Mam pytanie czy p. Tomasz mógłby sprawdzić ten klucz i powiedzieć czy on działa. I jak stworzyć kod qr z tym kluczem
ca.key Chiave privata RSA Robustezza: 2048 bit
Algoritmo: RSA Dimensione: 2048
Impronte digitali SHA1: 9C DA 84 2A 18 E2 51 F9 56 4B OF 1E EE EE F8 6D AF 47 FE B9
SHA256: F6 C4 82 13 E9 32 DB D5 A9 79 1C 7E 6F 3E 49 43 EA 53 24 78 3E DF 89 EA AB 8F 4D BA B8 25 8D EF
To tylko fingerprint klucza
A czy to jest klucz:
Sraat der Nederlanden Root CA – Identi.:Staat der Nederlanden Root CA – G3 Ver….St…der Nederlanden …LA-M. Scatlenza:25/112021
Nomesoggetto CN,Nomecormne, Staat der Nederlanden …LA-M. 0(Organissazione, Raeder Nederlanden C (Rae., NL
Nomeemanatore CN (Nome comune, …alder Nederlanden Root cA – G3 0(Organissazione, Staat der Nederlanden C (Nese, NL
Certificatoemesso Versione: 3 Numeroseriale: 00 E3 BA 34 5C 21 98 70 10 Non.. prima clel: 2021-10-26 il: 2021-11-25 Improntetligitali certificate SHA1: EA Fl 33 27 7C F2 01 CD 07 6B BB 20 01 5B DC 06 EF BC 25 FE MDS: 5B F2 CA 87 00 7B 81 63 C6 01 25 05 30 23 76 9A
Informazioni chiave pubblica Algoritmotlella <Nave: RSA Parametritlella <Nave: 05 00 Dimensionedella <Nave: 2048 ImprordatligitaledellachiaveSVIA1: 9C DA 84 2A 18 E2 51 F9 56 0B OF lE EE EE 60 AF 47 FE B9 pubblica: 30 82 01 OA 02 82 61 01 00 CO 48 0B 7E 64 90 E4 52 05 60 BO DB 02 F8 9F 05 A7 lE EB 99 CE DC 40 AO B4 BB Bfi 65 BB C3 56 84 BO A7 75 96 63 DO 57 1C 3A 07 8B 19 56 Afi 65 ED 95 5B FA Ffi 84 17 23 56 61 CC F0 AE 01 9/3 BD EA 03 BB 95 91 CE 62 71 F7 6A 56 35 77 Fl 75 El 42 6A fiF BC C7 54 16 C5 fiF 03 19 6A 97 50 07 2F 24 50 F0 lE 05 86 69 2B 36 BA 95 35 19 AE 30 01 7D 87 AO EB Eft EB 72 DB BB 11 C2 lE 21 76 A5 CA 40 05 BB E7 BO 6C 07 7E Cl B2 57 DB 30 00 CO 213 B2 75 6C 97 FF BD : 71 : : : E5 C9 DA B3 EC 97 BF 35 OF 01 12 22 lE 75 01 C3 FB CA 02 07 50 EE ED DO E6 FA B9 0B A5 9F 53 13 53 77 Cl FO BA F5 AD 57 DE 06 9C 0.11 19 BE
Itlentificatorechiavesoggetto Itlentificatore [Nave' 7B 09 F6 lA FB 23 66 AC B7 F9 OF BB 15 C6 B6 60 31) 2A F6
Estensione Itlentificatore: 2.52935 Valore: 30 16 BO 10 7B 09 F6 lA FB 23 66 AC B7 113 F9 OF BB 15 C6 B6 60 70 2A F6 Crap.:
Vincolitli base A.rit5 cerlitkAzione: Si Lunghessa massing percorso:
Firma Algorirmod firma: 12.840.113549.1.1.11 Rammer', della firma• 05 00
i jak tam, zbudowali tą odporność ? certyfikaty nie weszly, ale teraz nowa religia zastąpiła covidianizm, to klimatyzm