Občas je potřeba porovnat osobní údaje své databáze (zákazníků, uživatelů, …) s cizí databází. Třeba porovnat emaily nebo telefony a zjistit společný překryv uživatelů dvou různých služeb. Ani jedna strana té druhé nechce z logických důvodů předat svá data. Jak na to? Má to docela jednoduché řešení.

Princip spočívá v tom, že do hashovacího algoritmu vložíte údaj a dostanete dlouhou nesrozumitelnou změť čísel a písmen, který nejde* zpětně rozšifrovat na původní text. A když stejným algoritmem zahashuje stejný text někdo jiný, dostane shodnou změť čísel a písmen. Takže když se pak oba hashe porovnají, zjistíte, že máte oba v DB stejný záznam.

Příklad: Dejme tomu, že chci koupit konkurenční projekt, ale než to udělám, tak potřebuji vědět, zda se naše databáze nepřekrývají natolik, že by mi spojení nic nepřineslo.

Nejprve se vybere nějaký snadno porovnatelný a unikátní atribut – není vhodné jméno, protože existuje určitě více Janů Nováků a tak by to při porovnání nepomohlo. Kombinace jména a adresy už je lepší, ale není to praktické, protože existují různé možnosti, jak např. zapsat v adrese náměstí nebo ulici. Takové rodné číslo, to je zcela unikátní a perfektně se k porovnávání hodí. Ne vždy je však rodné číslo k dispozici (a taky jde o příliš citlivý údaj), a tak je lépe použít např. email, číslo mobilního telefonu, u firem pak třeba IČO. Také to může být v některých případech IP adresa atd.

Dejme tomu, že mám databázi s těmito 3 emaily:

JIRINA21234567@SEZNAM.CZ
123Petr546821@ gmail.com
Jonatan598779@centrum.cz

Krok 1: Normalizace dat

Protože se musí naprosto přesně shodovat všechny znaky, je potřeba nejprve sladit všechny údaje tak, aby se zamezilo jakékoliv variabilitě. Každé písmenko hraje roli.

Převeďte vše na malá písmena. Pokud budete porovnávat email Jonatan598779@centrum.cz s emailem jonatan598779@centrum.cz, rozdíl je jen ve velikosti prvního písmenka, ale bez této normalizace by bylo výsledkem, že se data neshodují, což je ale věcně špatně.

Odstraňte všechny mezery a nepovolené znaky. Mezera nemá v emailu co dělat, takže pryč s ní. Často bývají také na začátku nebo na konci, všechny smažte. Pokud pracujete s rodným číslem, smažte raději i lomítka, někde jsou a někde ne a tak je lepší pracovat bez nich. U telefonních čísel může být potřeba vyřešit (odstranit) pomlčky nebo závorky v předčíslí, apod.

Totéž musí udělat úplně stejně i druhá strana. Je proto lepší, když nejprve tyto úpravy udělá jedna strana, popíše postup a pak ho pošle druhé straně, aby postup přesně zopakoval.

Výsledek normalizace:

jirina21234567@seznam.cz
123petr546821@gmail.com
jonatan598779@centrum.cz

Krok 2: Osolit prosím

V kryptografii se používá termín „sůl“, která znamená, že k textu, který chcete zahashovat ještě z bezpečnostních důvodů přidáte ještě nějakou dodatečnou vycpávku, která nenese žádnou informaci. Například k emailu jonatan598779@centrum.cz přidám na konec ještě text „blabla“, takže vznikne jonatan598779@centrum.czblabla. Ideální je mít každý email do samostatného řádku, lépe se s tím pak pracuje v dalších krocích.

Výsledek solení:

jirina21234567@seznam.czblabla
123petr546821@gmail.comblabla
jonatan598779@centrum.czblabla

Krok 2: Zahešování dat

Nyní je potřeba abyste každý údaj samostatně zahešovali. S protistranou se musíte domluvit, jakým algoritmem budete oba hashovat. Existuje jich mnoho a každá vytváří jiný hash. Nejčastěji se využívá pro podobné účely MD5 nebo SHA-2-256 kvůli . Zvolím např. MD5:

Do generátoru vložím jonatan598779@centrum.czblabla a z generátoru MD5 vypadne hash: 89b734acdbcb216de0b572d0468ddc98. Pro zajímavost, když změním i jen jedno písmenko (j>J), bude hash úplně jiný:
Jonatan598779@centrum.czblabla > f589271b3b0da4e86d25c3039954e9d5
jonatan598779@centrum.czblabla > 89b734acdbcb216de0b572d0468ddc98

Toto je třeba udělat pro každý email (samostatně) v databázi. Protistrana udělá totéž se svou databází.

Výsledkem mé databáze je soubor zašifrovaných emailů:

8e64b173f9155afa7ab98b580fd22da2
105120e0c85cd4c28720f93eb64def4f
89b734acdbcb216de0b572d0468ddc98

V čem zašifrovat data?

Asi nejrychlejší je použít nějakou offline aplikaci, např. QuickHash. Pracuje se s ním snadno – vložit data, vyberat algoritmus, je tam i základní normalizace na malá/velká písmena.

Existuje mnoho online nástrojů, které to obratem udělají. Já je ale moc nedoporučuji kvůli bezpečnosti – když tam vložíte jen email bez soli, tak je možné, že 1) emaily někdo odchytává a že 2) si ukládá zdroj s jeho hashem do nějakého slovníku, ze kterého jdou pak emaily při jiných příležitostech dešifrovat. Trochu paranoi v tomto případě neškodí.

Bohužel MS Excel hashovací funkci (zatím) neobsahuje. Lze použít VBS v makru. Pár řešení už pro Excel existuje (např. https://tzamtzis.gr/2017/web-analytics/excel-function-md5-hashing-without-vba/ nebo https://seotoolsforexcel.com/mdfive/). Taky lze stáhnout aplikace, které to za Vás udělají.

Pro technicky založené není problém si skript vytvořit sám, např. v PHP se použije funkce md5($str).

Krok 3: Porovnání obou databází

Když obě strany udělali pomocí stejného normování, solení a hashování dva soubory, je třeba nyní záznamy jen porovnat a zjistit, které záznamy se shodují. Na to je nejlepší Excel – do prvního sloupečku (A) se vloží všechny hashe z první databáze – co řádek, to jeden hash. Do druhého sloupečku (B) všechny hashe z druhé databáze. Pak použijteme funkci MATCH (v češtině POZVYHLEDAT), která v dané oblasti zkouší najít hledaný text, pokud ho nenajde, vyhodí chybu a pokud najde, zobrazí se číslo (relativní) řádku.

Takže např. do buňky C1 se vloží vzoreček =POZVYHLEDAT(A1;B:B;0) znamenající najdi hash z A1 ve sloupečku B. Používám anglickou verzi Excelu, takže to mám takto =MATCH(A1;B:B;0)

Vzoreček se rozkopíruje pro všechny řádky sloupečku A a tím zjistím, kolik z mé DB obsahuje databáze partnera. Analogicky se to udělá pro záznamy ze sloupce B vůči A:A.

Hotovo 🙂

Máte lepší způsob? Pokud ano, napište mi ho prosím do komentářů.

* Hvězdička u „nejde zpětně rozšifrovat“ je proto, že 1) některé šifry byly časem prolomeny, 2) některé jsou rozšifrovat za použití obrovského výpočetního výkonu, což ale zatím není v možnostech běžné organizace nebo jednotlivců, 3) existují tzv. slovníky hashů – např. služby na online hashování mohou zdroj i has ukládat a mají tak obrovské databáze, pomocí kterých dokážou velké množství dat zpětně rekonstruovat.