24 riječi: što je to kriptografski identitet
Kriptografski identitet nije lozinka: niti jedan ga poslužitelj ne pohranjuje i ne može se vratiti. Didaktičko objašnjenje BIP39 mehanizma, zašto točno dvadeset i četiri riječi i kakva stvarna težina pada na onoga tko ih posjeduje.
Razlika između lozinke i identiteta
Lozinka je, u klasičnom internetskom modelu, dokaz identiteta. Korisnik ima identitet — ime, e-mail, korisnički broj — i, da bi poslužitelju dokazao da je onaj za kojeg se izdaje, predstavlja lozinku koju poslužitelj uspoređuje s pohranjenim otiskom. Ako se otisci podudaraju, poslužitelj odobrava sesiju. Ako se lozinka izgubi, korisnik ostaje isti korisnik; ono što se gubi jest dokaz, te postoji procedura oporavka — e-mail na registriranu adresu, sigurnosno pitanje — da bi se taj dokaz obnovio.
Kriptografski identitet funkcionira na drugačiji način. To je, prije svega, cjelovita matematička tajna sama po sebi, a ne vjerodajnica koju netko uspoređuje s pohranjenim otiskom. Nije važno gdje se nalazi — na papiru, na uređaju, čak i na tuđem poslužitelju —: identitet postoji zbog svoje matematike, a ne zbog toga tko ga potvrđuje. Ovdje se pojavljuje svojstvo slično onom koje smo vidjeli u 'Što je doista SHA-256': posjedovanje se ne dokazuje izlaganjem tajne, već njenom upotrebom za potpisivanje. Tako nastali potpis svatko može provjeriti pomoću javne vrijednosti koja se matematički izvodi iz same tajne, bez potrebe da se zna sama tajna i bez posredovanja treće strane u provjeri. Tko ima tajnu, taj je identitet; tko je izgubi, prestaje to biti. Presuda je kategorična: nema nikoga od koga biste mogli zatražiti da vam vrati identitet. Ta osoba ne postoji, jer je ni on nikada nije imao.
Što predstavlja dvadeset i četiri riječi
Kriptografski identitet obično se predstavlja matematičkom tajnom od trideset dva bajta — dvjesto pedeset i šest bita. Broj koji je teško upamtiti, a još teže prepisati bez greške. Kriptografska industrija riješila je ovaj problem 2013. godine malim i elegantnim standardom zvanim BIP39: način predstavljanja tih dvjesto pedeset i šest bita kao niza od dvadeset i četiri riječi preuzetih sa službene liste od dvije tisuće četrdeset i osam riječi. Aritmetika u pozadini uklapa se s elegancijom; onaj tko je želi vidjeti u detalje, naći će je na margini.
Brojanje nije dekorativno. Ako netko prepiše dvadeset i tri riječi točno, a pogriješi u dvadeset i četvrtoj, kontrolni zbroj će to otkriti: softver će mu reći "ovaj niz nije valjan". Ako netko prepiše sve dvadeset i četiri riječi točno, softver će nedvosmisleno izvesti isti identitet. Izbor popisa riječi također je namjeran: riječi BIP39 vokabulara su kratke, međusobno različite, bez dijakritičkih znakova, odabrane kako bi se minimizirale fonetske i pravopisne zabune. To je vokabular dizajniran da ga ljudi pamte, zapisuju i diktiraju bez gubitaka.
Od fraze do ključa
Dvadeset i četiri riječi nisu kriptografski ključ koji potpisuje poruke. One su povratni prikaz izvorne entropije koja se determinističkim procesom zvanim PBKDF2 transformira u sjeme (seed) od šezdeset i četiri bajta. Iz tog sjemena također se deterministički izvode konkretni kriptografski ključevi koje korisnik koristi: privatni ključ za potpisivanje i odgovarajući javni ključ koji se objavljuje za provjeru potpisa. Isti mehanizam u različitim sustavima: kriptovalute koriste krivulju secp256k1; Signal protokol i mnogi moderni sustavi koriste Ed25519 na krivulji Curve25519. Za konkretnu krivulju poput Ed25519 standardi BIP32 i SLIP-0010 uzimaju to sjeme od šezdeset i četiri bajta i deterministički izvode trideset i dva bajta koji čine učinkovit ključ za potpisivanje — istih onih trideset i dva bajta s kojima počinje primjer koda u sljedećem odjeljku.
Ovo je standardni način na koji cijela industrija predstavlja mehanizam korisniku —novčanici za kriptovalute, upravitelji decentraliziranog identiteta, Signal u svom dijelu za trajni identitet, Solo2 među njima—: korisnik u praksi nikada ne vidi sjeme niti izvedene ključeve. Vidi dvadeset i četiri riječi prilikom stvaranja svog identiteta i, po želji, zapisuje ih na papir. Riječi zatim putuju između njegovih uređaja kada želi migrirati identitet: unosi ih u novu aplikaciju, aplikacija izvodi isto sjeme, iste ključeve, isti identitet. To je prijenosan, kriptografski solidan i, u granicama razumnog, pamtljiv mehanizam.
Kako se potpisuje ključem (potez kistom u Zig-u)
U Zig-u, nakon što imate sjeme od trideset i dva bajta izvedeno iz dvadeset i četiri riječi, potpisivanje poruke pomoću Ed25519 stane u nekoliko redaka:
const std = @import("std");
const Ed25519 = std.crypto.sign.Ed25519;
// 'semilla' son los 32 bytes derivados de las 24 palabras.
const par = Ed25519.KeyPair.create(semilla);
// Firmar un mensaje con la clave privada:
const mensaje = "Este mensaje lo escribí yo.";
const firma = try par.sign(mensaje, null);
// Cualquiera con la clave pública del par puede verificar:
try Ed25519.Signature.verify(firma, mensaje, par.public_key);
Operacija potpisivanja proizvodi šezdeset i četiri bajta —zvanih potpis— koji su se mogli generirati samo iz odgovarajućeg privatnog ključa. Provjera je javna: svatko s javnim ključem može provjeriti odgovara li potpis poruci. Bez privatnog ključa nitko ne može proizvesti važeći potpis za tu poruku; s javnim ključem svatko može otkriti je li potpis važeći. Ta asimetrija je ono što omogućuje potpisniku da dokaže autorstvo bez dijeljenja tajne.
Prethodni primjer je minimalna verzija priručnika. U stvarnom Solo2 kodu, lanac prolazi kroz dvije datoteke, jednu u JavaScriptu koja živi u pregledniku korisnika i rekonstruira entropiju iz dvadeset i četiri riječi, drugu u Zigu unutar zcatcrypto knjižnice koja uzima tu entropiju i izvodi konkretne kriptografske ključeve. Počevši od strane preglednika:
// solo2/web-app/js/lib/bip39.js
async function mnemonicToEntropy(mnemonic, lang) {
const validation = await validateMnemonic(mnemonic, lang);
if (!validation.valid) {
return { entropy: null, valid: false, error: validation.error };
}
const wordlist = WORDLISTS[lang || 'en'];
const words = mnemonic.trim().split(/\s+/);
// Cada palabra aporta 11 bits (su índice en la lista de 2048).
let bits = '';
for (let i = 0; i < words.length; i++) {
bits += wordlist.indexOf(words[i]).toString(2).padStart(11, '0');
}
// 24 palabras = 264 bits. Los primeros 256 son la entropía.
const entropyBytes = new Uint8Array(32);
for (let j = 0; j < 32; j++) {
entropyBytes[j] = parseInt(bits.slice(j * 8, (j + 1) * 8), 2);
}
return { entropy: entropyBytes, valid: true };
}
Tih trideset i dva bajta entropije, zajedno s još trideset i dva izvedena u istom koraku, putuju do Zig WebAssembly modula koji generira same Ed25519 ključeve. Kompletna funkcija, sa svojim konačnim čišćenjem memorije, stane na jedan ekran:
// zcatcrypto/wasm/bindings/identity.zig
const Ed25519 = std.crypto.sign.Ed25519;
const X25519 = std.crypto.dh.X25519;
export fn identity_generate() ?*IdentityHandle {
var seed: [64]u8 = undefined;
if (!common.getRandomBytes(&seed)) return null;
const handle = common.wasm_allocator.create(IdentityHandle) catch return null;
// Bytes 0..31: semilla determinista del par Ed25519 (firma).
const sign_kp = Ed25519.KeyPair.generateDeterministic(seed[0..32].*) catch {
common.wasm_allocator.destroy(handle);
return null;
};
handle.sign_secret = sign_kp.secret_key.toBytes();
handle.sign_public = sign_kp.public_key.toBytes();
// Bytes 32..63: secreto X25519 (para acordar claves de cifrado con el otro).
handle.exchange_secret = seed[32..64].*;
handle.exchange_public = X25519.recoverPublicKey(handle.exchange_secret) catch {
common.wasm_allocator.destroy(handle);
return null;
};
@memset(&seed, 0); // Borra la semilla de la memoria.
return handle;
}
Vrijedi istaknuti dva detalja. Prvi: isti seed uvijek proizvodi isti par ključeva — upravo to omogućuje oporavak identiteta unosom dvadeset i četiri riječi u novi uređaj. Drugi: seed se eksplicitno briše iz memorije u zadnjem retku. Nakon te točke, čak ni sama funkcija ne bi mogla rekonstruirati ključeve; korisnikove riječi bile bi jedini izvor.
Ovdje je prikladan kratki zastoj, jer se cijeli lanac na brz pogled može zamijeniti s drugom primitivom iz trija: hashom. On to nije. Hash je jedinstvena funkcija koja komprimira — ulazi mnogo bajtova, izlazi kratki otisak, tu put završava. Kriptografski identitet je matematički komplementaran par: tajna ostaje i potpisuje; njezin javni pandan se objavljuje i provjerava. Tamo gdje hash urušava informacije u jednom smjeru, identitet uspostavlja asimetriju između dvije polovice. Hash svjedoči o tome što je rečeno; identitet svjedoči o tome tko je to rekao.
Što fraza nije
Potrebno je razjasniti tri česte zablude. Fraza nije lozinka u pravom smislu: ne uspoređuje se s otiskom pohranjenim na poslužitelju; unosi se u korisnikov uređaj kako bi se matematički rekonstruirao identitet. Fraza se ne vraća: ako se izgubi, nema je koga pitati; ako se duplicira, duplicira se i identitet. Fraza nije vjerodajnica odvojiva od identiteta: fraza jest identitet. Tko je posjeduje može djelovati kao taj identitet, bez dodatnog dopuštenja, bez postupka autorizacije, bez mogućnosti oporavka.
Ovo treće svojstvo jest ono što daje specifičnu težinu stvari. Izgubljena lozinka predstavlja administrativnu smetnju. Izgubljeni kriptografski identitet jest sâm identitet. Komadić papira s frazom koji pronađe netko treći nije rizik od krađe korisničkog računa: to je predaja cijelog identiteta. Obećanje sustava — da vam nitko ne može ukinuti identitet niti vas proizvoljno blokirati — neodvojivo dolazi s odgovornošću da ste vi jedini čuvar nečega što nitko umjesto vas ne može vratiti.
Obećanje i težina
Model kriptografskog identiteta obično se naziva samosuverena —self-sovereign u anglosaksonskoj literaturi—. Izbor riječi je namjeran i prilično točno opisuje stanje. Korisnik je suveren nad svojim identitetom u gotovo srednjovjekovnom smislu: ne dodjeljuje ga nijedan kralj, nijedan izdavatelj, nijedno središnje tijelo; niti ga itko od navedenih može povući. Ali također, poput srednjovjekovnog monarha, korisnik snosi punu posljedicu svojih pogrešaka: nema regenta koji bi donosio odluke umjesto njega ako izgubi pečat.
Izbor između identiteta kojim upravlja treća strana i samosuverenog identiteta nema jedinstven točan odgovor. Za korisnički račun na nevažnom forumu, upravljani identitet vjerojatno je razmjeran riziku. Za profesionalni identitet koji potpisuje pravno obvezujuće dokumente, za ekonomski identitet koji čuva vlastitu štednju, za identitet profesionalne komunikacije s klijentima koji su povjerili osjetljive informacije, pitanje se mijenja. Tamo pitanje prestaje biti „je li to zgodno?” i postaje „tko, osim mene, ima moć djelovati kao ja i pod kojim okolnostima?”.
Gdje se ovaj mehanizam pojavljuje u stvarnim sustavima
BIP39 je rođen u svijetu Bitcoina 2013. godine i brzo se proširio na cijeli ekosustav kriptovaluta: svaki ozbiljan novčanik danas prihvaća BIP39 frazu od dvanaest ili dvadeset i četiri riječi kao sigurnosnu kopiju ekonomske osobnosti svog vlasnika. Izvan kriptovaluta, isti temeljni koncept — kriptografski par koji dokazuje autorstvo bez posrednika — pojavljuje se u drugim sustavima s drugačijom sintaksom. SSH ključevi koje administrator sustava koristi za pristup svojim poslužiteljima klasičan su slučaj: privatni ključ koji administrator čuva na svom računalu i javni koji se kopira na svaki poslužitelj; ne intervenira nikakav subjekt usporediv s centraliziranom uslugom. Protokol Signal koristi Ed25519 s perzistentnim materijalom ključa na uređaju; europski eIDAS se u svom dijelu o kvalificiranom potpisu oslanjaju na isto kriptografsko načelo, s tom razlikom što ključ čuva kvalificirani pružatelj usluga povjerenja umjesto korisnika.
Solo2, izdavačka platforma ove publikacije, koristi BIP39 frazu od dvadeset i četiri riječi kao osobnost svakog korisnika. Korisnik prilikom kreiranja svog računa vidi riječi jednom. One se ne pohranjuju ni na jednom poslužitelju Solo2 niti bilo koga drugoga: ako ih korisnik zabilježi i čuva, zadržava svoju osobnost zauvijek. Ako ih izgubi, izgubio ih je. To je logična posljedica arhitekture bez posrednika: kada bi Solo2 mogao vratiti osobnost korisniku koji ju je izgubio, mogao bi je dati i bilo kome tko pritisne Solo2 da mu je da.
Pečat bez kancelarije
Srednjovjekovni monarh vladao je putem svog pečata, ali nije vladao samo njime: iza njega je stajala kancelarija, pisari koji su vodili zapise, dvor sposoban prepoznati krivotvorinu i pomoću svjedoka i institucionalne memorije rekonstruirati ono što je izgubljeni ili ukradeni pečat doveo u sumnju. Onaj tko danas čuva dvadeset i četiri riječi ima pečat i ništa više: nikakvu kancelariju, nikakvog pisara, nikakvu institucionalnu memoriju koja bi mogla riješiti spor ili vratiti izgubljeno. Presavijeni papir u ladici, ugravirana metalna ploča, zapečaćena omotnica u javnobilježničkom pologu samo su pokušaj, obrtnički i nužno nepotpun, da se pomoću alata privatne osobe stvori vlastita kancelarija.
Kralj bez kancelarije vlada potpuno jednako kao i onaj s njom —do onog dana kada izgubi pečat, a tog dana prestaje vladati, a da ne ostane nitko kome bi se mogao obratiti.
Ovaj članak zatvara konceptualni trio koji je otvorio ciklus — hash, šifriranje, osobnost —. Tri ideje grade se jedna na drugoj: hash daje nepromjenjiv otisak, šifriranje daje povjerljivost bez povjerljive treće strane, osobnost daje autorstvo bez treće strane koja ga dodjeljuje. Sva tri dijele svojstvo koje također nije ideološko: prenose s onoga tko upravlja uslugom na onoga tko je koristi tehničke sposobnosti koje su tradicionalno pripadale operateru. S njima prenose i odgovornosti. Iskren razgovor o bilo kojem od ova tri zahtijeva razgovor i o preostala dva.
Izvori i dodatno štivo
- Palatinus, M.; Rusnak, P.; Voisine, A.; Bowe, S. — BIP-0039: Mnemonic code for generating deterministic keys, prijedlog poboljšanja Bitcoina iz 2013. De facto standard za fraze za oporavak u kripto industriji.
- RFC 8032 — Edwards-Curve Digital Signature Algorithm (EdDSA), uključujući Ed25519. IETF, siječanj 2017. Normativna specifikacija sheme potpisa koja se koristi u velikom dijelu suvremene industrije.
- RFC 2898 — PKCS #5: Password-Based Cryptography Specification, verzija 2.0. IETF, rujan 2000. Definira PBKDF2 algoritam koji se koristi u BIP39 izvođenju iz fraze u seed.
- Uredba (EU) 910/2014 (eIDAS) i njezina evolucija Uredbom (EU) 2024/1183 (eIDAS 2) — europski okvir za elektroničku osobnost i kvalificirani potpis. Režim drugačiji od samovlasnog, ali konceptualno podržan istim kriptografskim primitivima.
- Allen, C. — The Path to Self-Sovereign Identity (2016). Kanonski tekst o načelima i obvezama samovlasnog modela, raniji, ali relevantan za razumijevanje obitelji suvremenih rješenja.