Samoporočanje — niste tako anonimni, kot mislite, da ste

mr.nEJC
3 min readMar 25, 2020

--

Pozdravljam vsako aktivnost, da informatiki pomagamo razumeti vpliv COVID-19 na družbo ter da se širšo javnost bolje informira o stanju na terenu, vendar bi bilo prav da ste vsi, ki sodelujete, bolje informirani o tem da informatiki nismo vsemogoči.

Ekipa portala COVID-19 Samoporočanje ob sporočanju podatkov zahteva tudi EMŠO, ki je varovan podatek po Zakonu o varstvu osebnih podatkov. Ob formularju je zapisano:

Vpisan EMŠO se NE POŠLJE preko spleta in se NE SHRANJUJE ampak se pred pošiljanjem anonimizira s SHA256 algoritmom. Na ta način iz anonimizirane EMŠO, ki jo hranimo, ni mogoče priti povratno do prave EMŠO. Vnašanje EMŠO pa je nujno za zagotavljanje konsistentnosti in verodostojnosti podatkov.

Sliši se vse lepo in prav, vendar zadeva ni povsem resnična — hekerska družba že dolgo pozna t.i. mavrične tablice, ki omogočajo ravno to — iskanje prave vrednosti iz “anonimizirane”.

Kaj je mavrična tablica?

Poenostavljeno gre za tabelo vseh možnih vhodov in njihovih pripadajočih zgostitev (hash). Tabela zgostitev (SHA256) za številke od 1 do 10 je videti takole:

Iz tabele tako preko zgoščene vrednosti (stolpec B) pridobimo osnovno vrednost (stolpec A).

Uporaba mavričnih tablic je problematična v trenutku ko je možnih kombinacij na vhodu toliko, da bi preračun vseh možnih vrednostni presegel strojne zmožnosti, ki so na voljo napadalcu — tako v uporabi procesorske moči kot tudi shranjevanja vseh vrednosti.

Sprva EMŠO deluje kot da je “dovolj varen” — dolg je 13 znakov, kar naj bi pomenilo 9.999.999.999.999 možnih kombinacij — kar bi bil velik zalogaj tudi za superračunalnike. A v realnosti je možnih kombinacij precej manj.

Priprava mavrične tablice EMŠO

Sprva poglejmo kako je EMŠO sestavljena — za pomoč poglejmo na Wikipedio:

EMŠO sestavlja trinajst števk (DDMMLLLRRZZZK), ki imajo naslednji pomen:

* od 1. do 7. števke: DDMMLLL — datum rojstva (dve mesti za dan, dve mesti za mesec in tri mesta za zadnje tri števke letnice rojstva)
* 8. in 9. števka: RR — številka registra, označuje območje rojstva osebe
* 10., 11. in 12. števka: ZZZ — zaporedna številka oziroma kombinacija spola in zaporedne številke za osebe, rojene istega dne (000–499 za moške in 500–999 za ženske)
* 13. števka: K — kontrolna števka, izračunana po modulu 11

Hiter preračun možnih kombinacij za vsa rojstva od 1.1.1900 do 31.12.2019 nam da 44.193.600.000 možnih EMŠO (31(DD) × 12(MM) × 120(LLL) × 99(RR) × 1000(ZZZ) × 10(K)).

A število kombinacij lahko še zožimo:

  • za številko registra (RR) lahko uporabimo samo fiksno vrednost “50” ki velja za Slovenijo
  • kontrolna številka (K) je preračunana, iz ostalih 12 številk, tako da je ne smemo upoštevati

Dobimo mnogo bolj obvladljiv set z 44.640.000 EMŠO (31(DD) × 12(MM) × 120(LLL) × 1(RR) × 1000(ZZZ)).

Python skripta za pripravo tablice se je na mojem starem računalniku izvajala dobrih 10 minut in pripravila datoteko velikosti 3 GB (nekoliko toliko kot je velika zadnja epizoda serije Star Trek: Picard v 1080p ločljivosti) v kateri je 40.919.996 zapisov, iskanje EMŠO po zgoščeni vrednosti pa traja približno 30 sekund.

In kaj zdaj ?

Dokazano je torej da je de-anonimizacija povsem možna. Zunanji napadalec, ki bi lahko pridobil dostop do baze samoporočanja ali celo nepridiprav znotraj ekipe, lahko preveri zdravstveno stanje vaše družine če pozna EMŠO pod katerim je bilo stanje sporočeno.

Zdaj ste seznanjeni z dejstvi, če se boste odločili za sodelovanje pa je vaša stvar …

--

--

mr.nEJC

Java, Linux, Adobe suite and coffee ... 'nuff said!