24 vārdi: kas ir kriptogrāfiskā identitāte
Kriptogrāfiskā identitāte nav parole: neviens serveris to neglabā un tā nav atgūstama. BIP39 mehānisma didaktisks skaidrojums, kāpēc tieši divdesmit četri vārdi un kāda reāla atbildība gulstas uz to, kurš tos pārvalda.
Atšķirība starp paroli un identitāti
Parole, klasiskajā interneta modelī, ir identitātes apliecinājums. Lietotājam ir identitāte — vārds, e-pasta adrese, klienta numurs —, un, lai serverim pierādītu, ka viņš ir tas, par ko uzdodas, viņš uzrāda paroli, ko serveris salīdzina ar saglabāto nospiedumu. Ja nospiedumi sakrīt, serveris piešķir sesiju. Ja parole tiek pazaudēta, lietotājs paliek tas pats lietotājs; tiek pazaudēts tikai apliecinājums, un pastāv atgūšanas procedūra — e-pasts uz reģistrēto adresi, drošības jautājums —, lai to atjaunotu.
Kriptogrāfiskā identitāte darbojas citādi. Tā pirmkārt un galvenokārt ir pilnīgs matemātisks noslēpums pats par sevi, nevis akreditācijas dati, ko kāds salīdzina ar saglabātu nospiedumu. Nav svarīgi, kur tā atrodas — uz papīra, ierīcē, pat svešā serverī: identitāte pastāv tās matemātikas dēļ, nevis tāpēc, ka kāds to apstiprina. Šeit parādās īpašība, kas līdzīga tai, ko redzējām «Kas patiesībā ir SHA-256»: piederība netiek pierādīta, parādot noslēpumu, bet gan izmantojot to parakstīšanai. Šādi iegūto parakstu jebkurš var pārbaudīt ar publisku vērtību, kas matemātiski atvasināta no paša noslēpuma, nezinot pašu noslēpumu, un bez trešās puses starpniecības pārbaudē. Kam pieder noslēpums, tas ir identitāte; kas to pazaudē, pārstāj tāds būt. Spriedums ir kategorisks: nav neviena, kam lūgt atgriezt identitāti. Tāda cilvēka nav, jo nevienam tās sākotnēji nebija.
Ko reprezentē divdesmit četri vārdi
Kriptogrāfisko identitāti parasti reprezentē trīsdesmit divu baitu – divu simtu piecdesmit sešu bitu – matemātisks noslēpums. Skaitlis, kuru grūti atcerēties un vēl grūtāk bez kļūdām norakstīt. Kriptogrāfijas nozare šo problēmu atrisināja 2013. gadā ar nelielu un elegantu standartu, ko sauc par BIP39: veidu, kā reprezentēt šos divus simtus piecdesmit sešus bitus kā divdesmit četru vārdu secību, kas izvēlēta no oficiāla divu tūkstošu četrdesmit astoņu vārdu saraksta. Aritmētika aiz tā der eleganti; kas vēlas to redzēt detalizēti, atradīs to apmales piezīmē.
Skaitīšanai nav dekoratīvas nozīmes. Ja kāds pareizi noraksta divdesmit trīs vārdus un kļūdās divdesmit ceturtajā, kontrolsumma to pamanīs: programmatūra viņam pateiks „šī secība nav derīga”. Ja kāds pareizi noraksta visus divdesmit četrus vārdus, programmatūra viennozīmīgi atvasinās to pašu identitāti. Vārdu saraksta izvēle arī ir mērķtiecīga: BIP39 vārdnīcas vārdi ir īsi, savstarpēji atšķirīgi, bez diakritiskajām zīmēm, izvēlēti, lai minimizētu fonētiskos un pareizrakstības pārpratumus. Tā ir vārdnīca, kas izstrādāta tā, lai cilvēki to varētu atcerēties, pierakstīt un nodiktēt bez zudumiem.
No frāzes līdz atslēgai
Divdesmit četri vārdi nav kriptogrāfiskā atslēga, kas paraksta ziņojumus. Tie ir atjaunojams sākotnējās entropijas attēlojums, kas, izmantojot deterministisku procesu, ko sauc par PBKDF2, tiek pārveidots par sešdesmit četru baitu sēklu (seed). No šīs sēklas arī deterministiski tiek atvasinātas konkrētās kriptogrāfiskās atslēgas, kuras lietotājs izmanto: privātā atslēga parakstīšanai un atbilstošā publiskā atslēga, kas tiek publicēta parakstu pārbaudei. Tas pats mehānisms dažādās sistēmās: kriptovalūtas izmanto secp256k1 līkni; Signal protokols un daudzas modernas sistēmas izmanto Ed25519 uz Curve25519 līknes. Konkrētai līknei, piemēram, Ed25519, BIP32 un SLIP-0010 standarti ņem šo sešdesmit četru baitu sēklu un deterministiski atvasina trīsdesmit divus baitus, kas veido faktisko parakstīšanas atslēgu — tos pašus trīsdesmit divus baitus, ar kuriem sākas koda piemērs nākamajā sadaļā.
Šis ir standarta veids, kā visa nozare iepazīstina lietotāju ar mehānismu —kriptovalūtu maki, decentralizētās identitātes pārvaldnieki, Signal tā pastāvīgās identitātes daļā, Solo2 starp tiem—: lietotājs praksē nekad neredz sēklu vai atvasinātās atslēgas. Izveidojot savu identitāti, viņš redz divdesmit četrus vārdus un pēc izvēles pieraksta tos uz papīra. Pēc tam vārdi ceļo starp viņa ierīcēm, kad viņš vēlas migrēt identitāti: viņš tos ievada jaunajā lietojumprogrammā, lietojumprogramma atvasina to pašu sēklu, tās pašas atslēgas, to pašu identitāti. Tas ir portatīvs, kriptogrāfiski pamatīgs un saprātīgās robežās iegaumējams mehānisms.
Kā parakstīt ar atslēgu (Zig triepiens)
Zig valodā, kad jums ir trīsdesmit divu baitu sēkla, kas atvasināta no divdesmit četriem vārdiem, ziņojuma parakstīšana ar Ed25519 aizņem tikai dažas rindiņas:
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);
Parakstīšanas darbība rada sešdesmit četrus baitus —sauktus par parakstu—, kurus varēja ģenerēt tikai no atbilstošās privātās atslēgas. Verifikācija ir publiska: jebkurš, kam ir publiskā atslēga, var pārbaudīt, vai paraksts atbilst ziņojumam. Bez privātās atslēgas neviens nevar izveidot derīgu parakstu šim ziņojumam; ar publisko atslēgu ikviens var noteikt, vai paraksts ir derīgs. Šī asimetrija ir tā, kas ļauj parakstītājam pierādīt autorību, neizpaužot noslēpumu.
Iepriekšējais piemērs ir rokasgrāmatas minimālā versija. Solo2 reālajā kodā ķēde iet caur diviem failiem: vienu JavaScript valodā, kas atrodas lietotāja pārlūkprogrammā un rekonstruē entropiju no divdesmit četriem vārdiem, otru Zig valodā zcatcrypto bibliotēkā, kas paņem šo entropiju un atvasina konkrētās kriptogrāfiskās atslēgas. Sākot no pārlūkprogrammas puses:
// 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 };
}
Šie trīsdesmit divi entropijas baiti kopā ar citiem trīsdesmit diviem, kas atvasināti tajā pašā solī, ceļo uz Zig WebAssembly moduli, kas ģenerē pašas Ed25519 atslēgas. Pilna funkcija ar tās galīgo atmiņas tīrīšanu ietilpst vienā ekrānā:
// 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;
}
Ir vērts atzīmēt divas detaļas. Pirmā: viena un tā pati sākuma vērtība (seed) vienmēr rada vienu un to pašu atslēgu pāri — tieši tas ļauj atgūt identitāti, ievadot divdesmit četrus vārdus jaunā ierīcē. Otrā: sākuma vērtība tiek skaidri izdzēsta no atmiņas pēdējā rindā. Pēc šī punkta pat pati funkcija nevarētu rekonstruēt atslēgas; lietotāja vārdi būtu vienīgais avots.
Šeit ir vietā īsa pauze, jo visu ķēdi no pirmā acu uzmetiena var sajaukt ar citu trijotnes primitīvu: jaucējkodu (hash). Tas tā nav. Jaucējkods ir unikāla funkcija, kas saspiež — ieiet daudz baitu, iziet īss nospiedums, tur ceļš beidzas. Kriptogrāfiskā identitāte ir matemātiski papildinošs pāris: noslēpums paliek un paraksta; tā publiskā daļa tiek publicēta un pārbaudīta. Tur, kur jaucējkods sakļauj informāciju vienā virzienā, identitāte izveido asimetriju starp divām pusēm. Jaucējkods apliecina, kas tika pateikts; identitāte apliecina, kas to pateica.
Kas frāze nav
Būtu jāizkliedē trīs bieži sastopami pārpratumi. Frāze nav parole šī vārda tiešajā nozīmē: tā netiek salīdzināta ar serverī saglabātu pirkstu nospiedumu; tā tiek ievadīta lietotāja ierīcē, lai matemātiski rekonstruētu identitāti. Frāze netiek atjaunota: ja tā tiek pazaudēta, nav neviena, kam to lūgt; ja tā tiek dublēta, tiek dublēta arī identitāte. Frāze nav no identitātes atdalāms akreditācijas datu kopums: frāze ir identitāte. Tas, kuram tā pieder, var rīkoties tās vārdā bez papildu atļaujas, bez autorizācijas procesa, bez atjaunošanas iespējas.
Šī trešā īpašība maina lietas būtību. Pazaudēta parole ir administratīva neērtība. Pazaudēta kriptogrāfiskā identitāte ir pazaudēta identitāte. Papīrs ar frāzi, ko atradušas trešās puses, nav konta zādzības risks: tā ir visas identitātes nodošana. Sistēmas solījums — ka neviens nevar atsaukt jūsu identitāti vai patvaļīgi jūs bloķēt — nāk kopā ar nedalāmu atbildību būt vienīgajam glabātājam kaut kam, ko neviens jūsu vietā nevar atjaunot.
Solījums un svars
Kriptogrāfiskās identitātes modeli bieži sauc par pašsuverēnu —self-sovereign angļu valodas literatūrā—. Vārda izvēle ir apzināta un diezgan precīzi raksturo stāvokli. Lietotājs ir suverēns pār savu identitāti gandrīz viduslaiku nozīmē: to nepiešķir neviens karalis, neviens emitents, neviena centrālā iestāde; tāpat neviens no minētajiem to nevar atņemt. Bet arī lietotājs, tāpat kā viduslaiku monarhs, uzņemas visas savu kļūdu sekas: nav regenta, kas pieņemtu lēmumus viņa vietā, ja viņš pazaudē zīmogu.
Izvēlei starp trešās puses pārvaldītu identitāti un pašsuverēnu identitāti nav vienas universāli pareizas atbildes. Sīka foruma kontam pārvaldīta identitāte, visticamāk, ir samērīga ar risku. Profesionālai identitātei, kas paraksta juridiski saistošus dokumentus, ekonomiskajai identitātei, kas sargā personīgos uzkrājumus, vai profesionālās saziņas identitātei ar klientiem, kuri uzticējuši sensitīvu informāciju, jautājums mainās. Tur jautājums vairs nav «vai tas ir ērti?», bet gan «kam, bez manis, ir vara rīkoties manu vārdā un kādos apstākļos?».
Kur šis mehānisms parādās reālās sistēmās
BIP39 radās Bitcoin pasaulē 2013. gadā un ātri izplatījās visā kriptovalūtu ekosistēmā: jebkurš nopietns maks šodien pieņem divpadsmit vai divdesmit četru vārdu BIP39 frāzi kā sava turētāja ekonomiskās identitātes dublējumu. Ārpus kriptovalūtām tas pats pamatkoncepcijas elements — kriptogrāfiskais pāris, kas pierāda autorību bez starpnieka — parādās citās sistēmās ar atšķirīgu sintaksi. SSH atslēgas, kuras sistēmas administrators izmanto, lai piekļūtu saviem serveriem, ir klasisks piemērs: privātā atslēga, ko administrators glabā savā mašīnā, un publiskā, kas tiek nokopēta katrā serverī; neiejaucas neviena subjekta, kas būtu salīdzināma ar centralizētu pakalpojumu. Signal protokols izmanto Ed25519 ar pastāvīgu atslēgas materiālu ierīcē; Eiropas eIDAS savā kvalificētā paraksta daļā balstās uz to pašu kriptogrāfisko principu, tikai ar to atšķirību, ka atslēgu glabā kvalificēts uzticamības pakalpojumu sniedzējs, nevis lietotājs.
Solo2, šīs publikācijas izdevējplatforma, katra lietotāja identitātei izmanto divdesmit četru vārdu BIP39 frāzi. Lietotājs, izveidojot savu kontu, vārdus redz vienu reizi. Tie netiek glabāti nevienā Solo2 vai kāda cita serverī: ja lietotājs tos pieraksta un glabā, viņš saglabā savu identitāti uz visiem laikiem. Ja viņš tos pazaudē, viņš tos pazaudē. Tās ir loģiskas sekas arhitektūrai bez starpnieka operatora: ja Solo2 varētu atdot identitāti lietotājam, kurš to pazaudēja, tā varētu to atdot arī jebkuram, kurš izdarītu spiedienu uz Solo2, lai to saņemtu.
Zīmogs bez kancelejas
Viduslaiku monarhs valdīja caur savu zīmogu, taču viņš nevaldīja tikai ar to vien: aiz tā stāvēja kanceleja, rakstveži, kas veda reģistrus, galms, kas spēja atpazīt viltojumu un ar liecinieku un institucionālās atmiņas palīdzību rekonstruēt to, ko pazaudēts vai nozagts zīmogs atstāja šaubās. Tam, kurš šodien sargā divdesmit četrus vārdus, ir zīmogs un nekas vairāk: nekādas kancelejas, neviena rakstveža, nekādas institucionālās atmiņas, kas varētu atrisināt strīdu vai atjaunot zaudēto. Salocīts papīrs atvilktnē, iegravēta metāla plāksne, aizzīmogota aploksne notāra depozītā ir tikai amatniecisks un neizbēgami nepilnīgs mēģinājums izveidot savu kanceleju ar privātpersonas instrumentiem.
Karalis bez kancelejas valda tieši tāpat kā karalis ar to —līdz dienai, kad viņš pazaudē zīmogu, un tajā dienā viņš pārstāj valdīt, neatstājot nevienu, pie kā vērsties.
Šis raksts noslēdz konceptuālo trio, kas uzsāka ciklu — hash, šifrēšana, identitāte —. Šīs trīs idejas balstās viena uz otru: hash sniedz nemainīgu nospiedumu, šifrēšana sniedz konfidencialitāti bez uzticamas trešās puses, identitāte sniedz autorību bez piešķirošas trešās puses. Visām trim ir kopīga īpašība, kas arī nav ideoloģiska: tās nodod no pakalpojuma pārvaldītāja lietotājam tehniskās iespējas, kas tradicionāli piederēja operatoram. Līdz ar tām tiek nodota arī atbildība. Godīga runāšana par jebkuru no šīm trim prasa runāt arī par pārējām divām.
Avoti un papildu literatūra
- Palatinus, M.; Rusnak, P.; Voisine, A.; Bowe, S. — BIP-0039: Mnemonic code for generating deterministic keys, 2013. gada Bitcoin uzlabošanas priekšlikums. De facto standarts atkopšanas frāzēm kriptogrāfijas nozarē.
- RFC 8032 — Edwards-Curve Digital Signature Algorithm (EdDSA), ieskaitot Ed25519. IETF, 2017. gada janvāris. Normatīvā specifikācija parakstīšanas shēmai, ko izmanto lielā daļā mūsdienu nozares.
- RFC 2898 — PKCS #5: Password-Based Cryptography Specification, 2.0 versija. IETF, 2000. gada septembris. Definē PBKDF2 algoritmu, ko izmanto BIP39 atvasināšanā no frāzes uz sēklu (seed).
- Regula (ES) 910/2014 (eIDAS) un tās attīstība ar Regulu (ES) 2024/1183 (eIDAS 2) — Eiropas ietvars elektroniskajai identitātei un kvalificētam parakstam. Režīms, kas atšķiras no pašsuverēnā, taču konceptuāli balstīts uz tiem pašiem kriptogrāfiskajiem primitīviem.
- Allen, C. — The Path to Self-Sovereign Identity (2016). Kanonisks teksts par pašsuverēnā modeļa principiem un saistībām, agrāks, taču būtisks, lai izprastu mūsdienu risinājumu saimi.