taavi013 kirjutas:
Isegi serverit pole vaja.
QR koodi sisu on allkirjastatud autoriseeritud privaatvõtmega ning sisu mittemuutmist ja allkirja õigsust saab kontrollida vajadusel ka offlines.
Vaktsineerituse info on kirjas QR koodis endas.
Jah, tegu kõige tavalisema
asümeetrilise krüptograafiaga:
Sõnumeid šifreerida saab ainult salajase võtmega, mida hoitaske kuskil serveri "kõhus" peidus, mis siis neid QR koode genereerib. Avalik võti on (nagu nimigi ütleb) vabalt kättesaadav ja lubab lisaks krüpteeritud sõnumi dešifreerimisele ka veenduda, et see šifreeriti kindlasti õige avaliku võtmega (ka ilma netiühenduseta).
Infona peab see QR kood sisaldama ainult isikukood ja ilmselt ka kuupäeva mil viimane doos tehti. Kui see nüüd krüpteerida näiteks suhteliselt kompaktse ECDSA Secp256K1 elliptilise kurvi algoritmiga, lisandub sõnumile signatuurina umbes 68 baiti. Vastav algoritm on antud tegevuse jaoks täiesti piisava turvalisusega
[1],
[2]Tegelikult ei pea isegi nii kokkuhoidlik olema, võib kasutata täitsa tavapraktikat ehk
JWT tokenit ES256 algoritmiga, mis
baseerub tegelikult eelmise algoritmi tsipakene turvalisemal sõsaral, CDSA Secp256
r1 (mida ka
NSA peab piisavalt kaitstuks valitsuse sõnumite jaoks välisriikide vastu)
JWT raiskab rohkem tähemärke kuna sõnumi peab vormistama
JSON vormingus, ning kuna tegu on laialtlevinud standardiga sisaldab ilmselt asju mis meie kasutusloo puhul pole vajalikud. Seeeest on see tõesti antud valdkonnas
de-facto standard Äärmiselt laialt levinud, triviaalselt lihtne tekitada ja kõikvõimalikes keeltes on genereerimiseks ja lugemiseks olemas turvalised teegid.
Pikk möla, kuidas see siis kõik töötaks?Väga lihtne demonstreerida:
1. Avage
JWT.io veebileht, kirjutage
decoded payload osasse vajalik info JSON vormingus nii et see sisaldaks vajalikku infot, näiteks:
Kood: Vali kõik
{
"id": "EE39111084207",
"name": "Ülo Nugis",
"date": "2021-07-11"
}
Kõik mida tuvastamiseks vaja läheb on olemas:
- "id" - On antud juhul isikukood koos riigi eesliitega ("EE") et arvestada ka välismaalastega, kelle võib seal otsas olla hoopis näiteks mingi dokumendinumber vms
- "name" - Nime lisasin igaks juhuks (jälle näiteks välismaalase mingilgi määral tuvastamiseks teise dokumendiga) aga ei ole hädavajalik
- "date" - kuupäev on ISO 8061 formaadils kuvatud viimase doosi kuupäev
2. Kopeerige
encoded osast saadud tulemus mõnda QR koodi generaatorisse,
näiteks sellesse (muide värvid JWT lehel näitavad ilusti mis osa sõnumist on päis, mis ülalnäidatud sisu ning mis on signatuur mida saab kasutada õigsuse valideerimiseks). Antud info puhul saan tulemuseks sellise QR koodi:
See on küll tiba suurem kui tavalised QR koodid kuid maksimaalsest lubatud 4296 sümboli limiidist ikka väga kaugel. Minu telefon suutis selle hetkega sisse lugeda.
Igatahes on see kõik mida ka programm netiühenduseta valideeritava turvalise QR koodi genereerimiseks tegema peab! Äppi tegemine, mis antud QR koodi loeks, tokenit verifitseeriks ja trükiks ekraanile "Härra Ülo Nugisel (i.k. see ja see) on tehtud vaktsineerimine 11. juulil 2021" ei ole suurem töö.
Ikkagi, mida ma selle pika jahumisega öelda tahan? Vastava digitaalse tõendi loomiseks vajalikke samme täpselt 3. Neist sammudest:
- ES256 võtme genereerimine on 2 käsurea käsku
- JWT tokeni genereerimine on teekide toel ühe käe sõrmedel koodiridu. Selliseid teeke leidub kõikvõimalikes kasutuselolevates progemiskeeltes (huvi korral lihtsalt scrollige JWT.io lehel alla, et toetatud implementatsioone näha).
- QR koodi genereerimisega on olukord kaunis sarnane. Teeke on kõriauguni, kasutus on mõned koodiread.
Ehk siis lihtne?Jah,
Proof of Concept tasemel on selline ülesanne keerukuselt midagi sellist mille ma annaks lahendada 2. või 3. kursuse tudengile
ühes aines ühe nädala kodutööks.
Reaalset arendusmahtu seda kõike siin korrektselt vormistada on maksimum paar päeva kuni nädal kaks (sõltuvalt süsteemi eripäradest ja arhailisusest).