Skaitmeninis produkto pasas ne visiems rodo tą patį. Pirkėja mato viešus duomenis. Remonto įmonė ar perdirbėjas mato daugiau. Rinkos priežiūros institucija mato viską. Tai aišku, ir Europos standartai dabar tai aiškiai nustato.
Įdomus klausimas yra šiek tiek subtilesnis: jei kam nors atskleidžiami ne tik vieši duomenys, bet ir apsaugoti laukeliai, ar jis gali įrodyti, kad būtent šie laukeliai yra autentiški? Arba ar jis turi pasitikėti, kad platforma juos teisingai atrinko ir perdavė nepakeistus?
Daugumos platformų atveju sąžiningas atsakymas yra: pasitikėjimas. Mes savo platformą sukūrėme taip, kad atsakymas būtų „įrodymas“ - ne tik viešųjų laukelių atveju, bet ir kiekvieno laukelio, kuris pridedamas tik atskleidimo metu. Kodėl šis skirtumas yra svarbus ir kodėl mes pasirinkome sudėtingesnį kelią.
Prieigos taisyklę visi laikosi vienodai
EN 18239, Europos standartas, reglamentuojantis prieigos teises, saugumą ir konfidencialumą DPP, reikalauja prieigos kontrolės pagal kiekvieną duomenų elementą: kiekvienam laukeliui yra nustatyta taisyklė, kas jį gali matyti. Tai teisingas reikalavimas, ir jį įvykdyti nėra sunku. Kokį statusą iš tikrųjų turi šios normos, išsamiai išdėstėme straipsnyje „Suderintos normos“.
Įprastas būdas tai pasiekti - filtravimas serverio pusėje. Serveris žino, kas teikia užklausą, patikrina, ką šis asmuo gali matyti, ir pateikia būtent tą informacijos dalį. Prieigos kontrolė: atlikta. Standartas daugiau nieko nereikalauja.
Tačiau yra vienas „kabliukas“, kurio standartas neatsižvelgia: Ištrauka gaunama nepasirašyta. Skaitytojas gauna jam paruoštą vaizdą ir turi tikėti, kad serveris jį atrinko sąžiningai ir kelionės metu nieko nepakeitė. Viešam informaciniam lapui tai tinka. Tačiau kai kalbama apie vertę, kuria perdirbėjas grindžia naudotos baterijos kainą, tai reikalauja daug pasitikėjimo.
Kur pavienis parašas pasiekia savo ribas
Akivaizdus sprendimas - pasirašyti duomenis. Abiem skalės kraštams puikiai tinka įprastas parašas: pasirašyti viešą vaizdą, pasirašyti visą duomenų rinkinį, o abu patikrinti pagal viešąjį raktą, be tarpinio serverio. Kaip tai vyksta išsamiai, aprašyta straipsnyje „Parašai ir sertifikatai DPP sistemoje“.
Problema kyla viduryje. Visą dokumentą apimantis parašas apima tik vieną laukų rinkinį, būtent tuos, kurie buvo parašo metu. Jei įgaliotam skaitytojui papildomai atskleidžiama apsaugota laukelė, ši laukelė lieka už pasirašyto duomenų rinkinio ribų ir jam pasiekia neapsaugota. Jei vietoj to iš pat pradžių pasirašomas visas duomenų rinkinys, parašas apima viską, tačiau tuomet reikėtų viską parodyti visiems.
Taigi tarpiniai lygmenys lieka neapsaugoti: remonto dirbtuvės, draudikas, perdirbėjas. Jei norėtume iš anksto pasirašyti kiekvieną galimą „kas ką mato“ derinį, kiekvienam deriniui reikėtų atskiro pasirašyto dokumento, o derinių skaičius eksponentiškai augtų su kiekviena nauja prieigos grupe. To niekas nedaro. Grįžtama prie nepasirašyto serverio filtro, o tarpinis lygmuo vėl remiasi pasitikėjimu.
Kiekvieno lauko pasirašymas atskirai
Yra geresnė konstrukcija, ir būtent ant jos mes kuriame platformą. Užuot pasirašęs gatavą dokumentą kaip vieną bloką, išdavėjas per vieną pasirašymo ciklą atskirai nustato kiekvieną laukelį (tiems, kurie išmano standartus: W3C sertifikatas „ecdsa-sd-2023“ selektyviam atskleidimui).
Kiekvienas vaizdas prasideda nuo viešojo branduolio
Kiekvienas vaizdas prasideda nuo tų pačių viešųjų laukelių. Tai, ką skaitytojas mato toliau, pridedama laukelis po laukelio, ir kiekvienas iš šių laukelių vis tiek veda atgal prie išdavėjo viešojo rakto - neprisijungus prie interneto, be pakartotinio pasirašymo ir be pasitikėjimo institucija, kuri sudarė šį vaizdą. Laukeliai, į kuriuos nėra teisių, tiesiog trūksta. Neužtušuoti, o iš viso jų nėra, ir apie juos nieko neprasiskverbia.
Kodėl „nesulaužytas“ yra esmė
Įsivaizduokite notarą, kuris patvirtina ne visą laišką, o kiekvieną pastraipą atskirai. Viešą laišką gauna kiekvienas. Kas turi teisę į daugiau, gauna papildomus paragrafus, ir kiekvienas iš jų toliau yra pažymėtas to paties notaro antspaudu. Įprastu būdu platforma šiuos paragrafus perrašo už jus, o tai, kas pasiekia jus, yra pažymėta tik jos žodžiu.
Kodėl čia svarbu, kad antspaudas būtų „nesulaužytas“, verta paaiškinti dar vienu sakiniu. Nesulaužytas antspaudas nereiškia, kad turinys yra teisingas. Jis reiškia: būtent tai parašė išdavėjas, ir nuo to laiko niekas nepadarė jame nė menkiausio pakeitimo. Taigi iš pasitikėjimo klausimo iškrenta kiekvienas, kuris dokumentą tik perdavė toliau - tarpinė saugykla, tinklas, archyvas, mes. Kas jums perdavė pasą, jau nebeturi reikšmės.
O antspaudas yra binarinis. Jis laikosi arba nelaikosi, pusiau sulaužyto antspaudo nėra. Jei jis sulūžta, jūs nesužinosite, kuris sakinys buvo pakeistas, o tik tai, kad nebegalite pasitikėti visu dokumentu. Todėl nėra laipsniško skirtumo, ar papildomi laukeliai pas jus pasiekia su antspaudu, ar be jo: be antspaudo jie nėra šiek tiek silpniau užpildyti - jie visai nėra užpildyti.
Abu peržiūros būdai
Kiekvienas gali tai patikrinti pats. „Transpareo Time Machine“ yra mūsų atviro kodo produktų pasų peržiūros programa: ji naršo paso versijų istoriją ir tuo pačiu perskaičiuoja kiekvieną parašą žiūrovo naršyklėje, nekreipdamasi į mūsų serverį. Joje viešai veikia du pavyzdiniai pasai. Marškinėlių pase yra viso dokumento parašas, o baterijos pase - atskirų laukelių atskleidimas.
Abi yra atviros W3C specifikacijos: eddsa-jcs-2022 - visam dokumentui taikomam parašui, ecdsa-sd-2023 - atskirų laukelių atskleidimui. Jas gali įgyvendinti kiekvienas, kas nori. Sunkumai yra priežastis, kodėl daugelis to nedarys: parašą, apimantį visą dokumentą, kurti ir prižiūrėti yra žymiai pigiau, o tiems, kurie teikia tik viešus duomenis, to pakanka.
Tai, kad „Time Machine“ moka naudoti abu metodus, yra tyčinis sprendimas ir taip liks. Ji nepriklauso jokiai platformai. Tikrintojas, kuris priimtų tik brangesnį metodą, būtų naudingas tik mums ir niekam kitam.
Kam atskleidžiami apsaugoti laukai
Verta paklausti, kam, be viešųjų duomenų, apskritai kas nors yra atskleidžiama. Ne atsitiktinei pirkėjai - ji gauna viešąjį sertifikatą. Tai yra perdirbėjas, kuris vertina, kiek vertas naudotas baterijų rinkinys, draudikas, kuris įvertina riziką, perdirbėjas, kuris rūšiuoja chemines medžiagas, ir valdžios institucija, kuri nagrinėja bylą. Tai yra skaitytojai, kurių sprendimai priklauso nuo pinigų ar saugumo.
Ir būtent šie laukai įprastu metodu lieka neapimti. Tas, kuris turėtų didžiausią priežastį norėti kriptografinio patvirtinimo, jo negauna būtent tiems laukams, nuo kurių priklauso jo sprendimas.
Manome, kad sertifikavimo ženklas turėtų reikšti tą patį visiems. Užrašas „Patikrinta „Transpareo““ išplėstiniame remonto dirbtuvių vaizde reiškia tą patį, kaip ir pirkėjos viešajame pase: kiekviena parodyta sritis yra išdavėjo pateikta ir nuo to laiko nebuvo keista. Sertifikatas, kuris galioja tik viešiesiems laukeliams, yra tik pusė sertifikato.
Daugiau, nei reikalauja standartas
Sakome atvirai: nė viena iš šių nuostatų nėra privaloma. Standartas EN 18239 reikalauja, kad prieiga būtų kontroliuojama, o serverio pusėje esantis filtras prieigą kontroliuoja nepriekaištingai. Net ir viešai atskleistų laukelių kriptografinis patikrinimas yra tai, ką mes darome papildomai, o ne privalomas reikalavimas, kurio iš mūsų reikalauja reglamentai.
Būtent todėl tai verta užrašyti. Būtų lengva laikytis standarto raidės, pateikti serverio filtrą ir paskelbti, kad šis etapas baigtas. Mes norime, kad šis įsipareigojimas galiotų visur, kur pasirodo šis ženklas. Juk pasirašyto paso esmė yra ta, kad niekas neturi pasitikėti platforma. Išimti vidurinį lygį kaip išimtį reiškia susigrąžinti būtent tą pasitikėjimą, kurį parašas turėjo panaikinti.
Tas pats principas leidžia pamiršti laukelį
Atskirai apibrėžti kiekvieną laukelį suteikia antrą savybę, o jos iš tikrųjų reikalauja Europos teisė. Bendrasis duomenų apsaugos reglamentas suteikia asmenims teisę reikalauti, kad jų asmens duomenys būtų ištrinti. Duomenų rinkinys, pasirašytas kaip vienas blokas, negali to padaryti nesunaikindamas savo paties parašo.
Kadangi čia kiekvienas laukas yra atskiras, galima pašalinti vieną lauką, o visa kita ir toliau lieka patikrinama. Jei asmens duomenys netyčia patenka į pasą, jie gali būti švariai pašalinti, o pasas lieka galiojantis: nereikia išduoti naujo paso, istorija lieka nepertraukta. Reglamentuojami laukeliai, kuriuos pagal įstatymą privaloma saugoti, lieka nepakitę; tai, kas gali būti ištrinta, gali būti ištrinta pagal prašymą net praėjus metams.
Vis dėlto tai visiškai įprastas pasas
Nė vienas iš šių aspektų nepadaro paso ypatingu objektu, kurį gali atidaryti tik mūsų įrankiai. Jis lieka „Verifiable Credential“ JSON-LD formatu - formatu, kuriuo orientuojasi interneto standartų pasaulis, ir kurį naudoja JT skaidrumo protokolas bei visa W3C aplinka.
Taigi pasas, kurį pirkėja nuskenuoja naršyklėje, yra tas pats objektas, kurį gali nuskaityti duomenų saugyklos partneris, ir jį gali patikrinti bet kuris standartus atitinkantis tikrintojas, ne tik mūsų. Papildomas saugumas skaitytojui nieko nekainuoja ir niekam nesieja su mumis.
Kodėl tai techniškai sudėtinga
Pirmiausia, kad nesusidarytų klaidingas įspūdis: mes šio metodo neišradome. ecdsa-sd-2023 yra vieša W3C specifikacija, joje naudojama kriptografija nėra mūsų sukurta, ir kas nori ją įgyvendinti, gali apie tai paskaityti. Sunku ne sugalvoti idėją. Sunku ją įgyvendinti taip, kad pasas veiktų dar ir po dešimties metų. Būtent čia slypi darbas, ir apie tai galima pasakyti kažką naudingo.
Skirtumas atrodo nedidelis, tačiau jis keičia pagrindą: įprastas parašas atlieka skaičiavimus remdamasis dokumento baitais. Selektyvus atskleidimas skaičiuojamas pagal jo teiginius. Prieš pasirašant pasas paverčiamas standartizuota forma, kurioje kiekvienas duomenų elementas pateikiamas kaip atskiras, savarankiškas teiginys. Tik taip galima praleisti vieną teiginį, nepažeidžiant likusiųjų.
Taip atsiranda problema, kurios neturi baitų parašo: ta pati standartizuota forma po dešimties metų turi būti atkurta tiksliai. Ne apytikriai, o simbolis po simbolio, kitaip įrodymas nebetiks. Tam trukdo trys dalykai, ir visi trys yra nepastebimi.
Skaičiai praranda savo tipą. Jei skaičių užrašome kaip paprastą JSON, pakeliui prarandama informacija, kokio tipo skaičius tai buvo. Tokia reikšmė kaip 2,0 po apdorojimo JSON grįžta kaip 2. Žmogui tai tas pats, o standartizuotai formai - kitas sakinys, todėl patikrinimas žlunga.
Pavadinimai dar nereiškia prasmės. Kad susidarytų standartizuota forma, kiekvienas lauko pavadinimas turi būti susietas su vienareikšme prasme. Jei trūksta vienos, laukas konvertavimo metu tyliai išnyksta. Tada jis lieka pase, bet patvirtinimas jo neapima, ir niekas to nepastebi.
Reikšmės paprastai yra internete. Šis atitikimas yra žodyne, kurį dauguma įrankių tikrinimo metu atsisiunčia iš interneto. Kas taip daro, savo paso tikrinamumą susieja su tuo, ar svetimas adresas po dešimties metų vis dar atsakys, ir būtent nepakitęs.
Kaip mes tai išsprendėme
Mes uždarėme šiuos tris taškus pačioje šaknyje, o ne bandėme juos sugauti vėliau.
Tipai. Kiekviena reikšmė rašoma su savo tipu, o skelbimas nutraukiamas, vos tik standartizuotoje formoje pasirodo bent vienas skaičius be tipo. Taigi klaida aptinkama ten, kur ji kainuoja vieną eilutę, o ne po kelerių metų kaip nepaaiškinamas patikrinimo pažeidimas.
Žodynai. Kiekvienas žodynas, į kurį nuorodoje nurodo pasas, yra saugomas lokaliai ir niekada neatsisiunčiamas iš interneto. Nežinomas adresas reiškia staigų pasirašymo nutraukimą, o ne tylų grįžimą prie tuščio rezultato.
Identifikatoriai. Kiekvienas dokumento mazgas turi stabilų identifikatorių, kad standartizuota forma išliktų atkuriamoji, o ne kiekvieno apdorojimo metu būtų priskiriami nauji pagalbiniai pavadinimai.
Sudėtingiausia dalis yra „Bring Your Own Key“ (atsinešk savo raktą). Kiekvienam išdavimui reikalingas papildomas, trumpalaikis raktas, kuriuo atskirai pasirašomi atskleidžiami laukai. Šį raktą pats išdavėjas sukuria ir sunaikina. Jei raktas būtų pas mus, galėtume vėliau sugalvoti atskirus laukelius, o eksponento parašo nepriklausomybė būtų tik deklaratyvi. Grįžtantį patvirtinimą patikriname pagal saugomą viešąjį raktą, prieš juo pasitikėdami.
Kiekviename pase yra du tokie įrodymai: vienas iš išdavėjo, kitas iš „Transpareo“, ir abu jie skaitytojui pateikiami nepriklausomai vienas nuo kito. Dvi parašai, dvi viena nuo kitos nepriklausomos institucijos - net ir vienam atskirai atskleistam laukeliui.
Mūsų nuomone, šios pastangos yra pagrįstos. Patikrinamumo funkcijos nebuvo įdiegtos vėliau; platforma nuo pat pirmosios versijos buvo sukurta būtent šiam tikslui. Kiekvienas pasas pasirašomas jį paskelbiant ir susiejamas su ankstesne versija. Sukurtas nepakeičiamas dešimties metų archyvas, kuris įsigalioja, kai pasai užregistruojami ES DPP registre. Kiekvieno lauko, o ne viso bloko, pasirašymas yra šio pagrindinio principo išplėtimas, o ne priedas prie to, kas niekada nebuvo tam skirta.
Kur esame
Jei viską supaprastinti, pasirinkimas yra paprastas. Galite atskleisti apsaugotus laukelius ir paprašyti skaitytojo pasitikėti jūsų filtru - tai atitinka standartą. Arba galite juos atskleisti ir kartu pateikti įrodymą - tai atitinka aukštesnius reikalavimus, kuriuos, mūsų nuomone, šie laukeliai nusipelno.
Mes pasirinkome įrodymą kiekvienam skaitytojui, nes antspaudas turėtų reikšti tą patį, nesvarbu, kas į jį žiūri. Kas nori pamatyti, kaip tai veikia: abi aukščiau pateiktos nuorodos į demonstracijas patikrinamos tiesiogiai naršyklėje, neprisijungus prie interneto, naudojant tik viešąjį raktą.
