Jaukšana ir process, kurā tiek ģenerēts fiksēta izmēra rezultāts, izmantojot mainīga izmēra ievades datus. Šim mērķim tiek izmantotas matemātiskas formulas, ko dēvē par jaucējfunkcijām (tās tiek īstenotas kā jaukšanas algoritmi).
Lai gan ne visas jaucējfunkcijas paredz kriptogrāfijas izmantošanu, t. s. kriptogrāfiskās jaucējfunkcijas veido kriptovalūtu pamatu. Pateicoties tām, blokķēdēs un citas decentralizētās sistēmās ir iespējama augsta līmeņa datu integritāte un drošība.
Gan parastās, gan kriptogrāfiskās jaucējfunkcijas ir deterministiskas. Termins "deterministisks" nozīmē, ka, ja vien netiks mainīti ievades dati, jaukšanas algoritms vienmēr ģenerēs vienu un to pašu rezultātu (t. s. jaucējkodu).
Parasti kriptovalūtu jaukšanas algoritmi ir veidoti kā vienvirziena funkcijas, proti, nav iespējams vienkāršā veidā, neieguldot daudz skaitļošanas laika un resursu, no rezultāta iegūt ievaddatus. Citiem vārdiem sakot, var visai viegli iegūt rezultātu no ievaddatiem, taču ir salīdzinoši grūti veikt procesu pretējā virzienā (iegūt ievaddatus, ja ir zināms tikai rezultāts). Kopumā – jo grūtāk ir noskaidrot ievaddatus, jo drošāks tiek uzskatīts jaukšanas algoritms.
Kā darbojas jaucējfunkcija?
Dažādas jaucējfunkcijas radīs dažādu izmēru rezultātus, taču katram jaukšanas algoritmam vienmēr ir nemainīgs iespējamais rezultāta izmērs. Piemēram, SHA-256 algoritms var ģenerēt tikai 256 bitu rezultātus, bet SHA-1 algoritms vienmēr ģenerē 160 bitu jaucējkodu.
Kā piemēru izmantosim SHA-256 jaukšanas algoritmu (kuru izmanto Bitcoin) vārdiem "Binance" un "binance".
Ņem vērā, ka pat nelielu izmaiņu gadījumā (mainot vārda sākumburta lielumu) tiek iegūts pilnīgi atšķirīgs jaucējkods. Taču, tā kā mēs izmantojam SHA-256, rezultāts vienmēr atbildīs 256 bitu jeb 64 rakstzīmju formātam – neatkarīgi no ievades datu izmēra. Turklāt – lai cik reižu mēs piemērotu šo algoritmu tiem pašiem diviem vārdiem, vienmēr tiks iegūti šie divi rezultāti.
Savukārt, ja tiem pašiem ievaddatiem piemērosim SHA-1 jaukšanas algoritmu, iegūsim šādus rezultātus:
Akronīms "SHA" nozīmē "Secure Hash Algorithms" jeb "droši jaukšanas algoritmi". Tas apzīmē kriptogrāfisko jaucējfunkciju kopumu, kas ietver SHA-0 un SHA-1 algoritmus, kā arī SHA-2 un SHA-3 algoritmu grupas. SHA-256 ietilpst SHA-2 grupā, tāpat kā SHA-512 un citi varianti. Pašlaik par drošām tiek uzskatītas tikai SHA-2 un SHA-3 grupas.
Kāpēc tas ir svarīgi?
Parastām jaucējfunkcijām ir plašas izmantošanas iespējas, tostarp meklēšana datu bāzēs, apjomīgu failu analīze un datu pārvaldība. Savukārt kriptogrāfiskās jaucējfunkcijas tiek plaši izmantotas informācijas drošības jomā, piemēram, ziņojumu autentifikācijai un digitālajiem nospiedumiem. Bitcoin tīklā kriptogrāfiskajām jaucējfunkcijām ir svarīga loma ieguves procesā, kā arī jaunu adrešu un atslēgu ģenerēšanā.
Patiesais jaucējfunkcijas spēks atklājas tad, ja ir jāapstrādā milzīgs informācijas apjoms. Piemēram, jaucējfunkciju var piemērot apjomīgam failam vai datu kopai, lai pēc tam, izmantojot iegūto rezultātu, ātri pārbaudītu datu precizitāti un integritāti. Šādu iespēju nodrošina jaucējfunkciju deterministiskais raksturs – no ievades datiem vienmēr tiek iegūts vienkāršots, koncentrēts rezultāts (jaucējkods). Izmantojot šādu paņēmienu, nav nepieciešams glabāt un "iegaumēt" lielus datu apjomus.
Jaukšana ir īpaši noderīga saistībā ar blokķēdes tehnoloģiju. Bitcoin blokķēdē ir vairākas darbības, kas ietver jaukšanu, un vairums no tām attiecas uz ieguves procesu. Faktiski gandrīz visi kriptovalūtu protokoli izmanto jaukšanu, lai saistītu un apvienotu darījumu grupas blokos, kā arī lai izveidotu kriptogrāfiskas saites starp visiem blokiem, tādējādi izveidojot blokķēdi.
Kriptogrāfiskās jaucējfunkcijas
Tātad – jaucējfunkciju, kas izmanto kriptogrāfiskus paņēmienus, var definēt kā kriptogrāfisku jaucējfunkciju. Kopumā, lai izjauktu kriptogrāfisku jaucējfunkciju, ir nepieciešams veikt neskaitāmus pārlases uzbrukumu mēģinājumus. Lai varētu "reversi" atšķetināt kriptogrāfisku jaucējfunkciju, būtu jācenšas uzminēt izmantotie ievaddati, līdz tiktu iegūts attiecīgais rezultāts. Tomēr pastāv arī iespējamība, ka atšķirīgi ievaddati radīs vienu un to pašu rezultātu, tādējādi veidojoties "sadursmei".
Tehniski, lai kriptogrāfisku jaucējfunkciju varētu uzskatīt par drošu, tai ir jāpiemīt trim īpašībām. Tā ir noturība pret sadursmi, pirmtēlu un otro pirmtēlu.
Pirms pievēršamies katrai no šīm īpašībām, apkoposim to pamatā esošo loģiku trīs vienkāršos teikumos.
Noturība pret sadursmi – nav iespējams atrast divus dažādus ievaddatus, kas rezultātā radītu vienu un to pašu jaucējkodu.
Noturība pret pirmtēlu – nav iespējams "reversi" atšķetināt jaucējfunkciju (noskaidrot ievaddatus, izmantojot iegūto rezultātu).
Noturība pret otro pirmtēlu – nav iespējams atrast otrus ievaddatus, kas veidotu sadursmi ar noteiktiem ievaddatiem.
Noturība pret sadursmi
Kā minējām, sadursme veidojas tad, ja divi dažādi ievaddati rada vienu un to pašu jaucējkodu. Tādējādi jaucējfunkcija ir uzskatāma par noturīgu pret sadursmi līdz brīdim, kad kāds konstatē sadursmi. Jāņem vērā, ka visām jaucējfunkcijām pastāv sadursmes, jo iespējamo ievaddatu ir bezgalīgi daudz, bet iespējamie rezultāti ir ierobežoti.
Citiem vārdiem sakot, jaucējfunkcija ir noturīga pret sadursmi tad, ja sadursmes iespējamība ir tik zema, ka būtu nepieciešami vairāki miljoni gadu skaitļošanas. Tādējādi, lai gan neviena jaucējfunkcija nav pilnībā pasargāta no sadursmēm, dažas no tām ir pietiekami spēcīgas, lai tiktu uzskatītas par noturīgām pret sadursmi (piem., SHA-256).
Konstatēto sadursmju dēļ SHA-0 un SHA-1 algoritmu grupas vairs netiek uzskatītas par drošām. Pašlaik par noturīgām pret sadursmi tiek uzskatītas SHA-2 un SHA-3 grupas.
Noturība pret pirmtēlu
Noturība pret pirmtēlu ir saistīta ar ideju par vienvirziena funkcijām. Jaucējfunkcija tiek uzskatīta par noturīgu pret pirmtēlu, ja ir ļoti zema iespējamība, ka kāds noskaidros ievaddatus, kas ģenerējuši konkrēto rezultātu.
Jāņem vērā, ka šī īpašība atšķiras no iepriekšējās, jo uzbrucējs mēģina uzminēt ievaddatus, aplūkojot konkrēto rezultātu. Savukārt sadursme veidojas tad, ja kādam izdodas atrast divus atšķirīgus ievaddatus, kas ģenerē vienu un to pašu rezultātu, taču nav svarīgi, kuri ievaddati tika izmantoti.
Noturība pret pirmtēlu ir nozīmīga datu aizsardzībā, jo ar vienkāršu ziņojuma jaucējkodu var apliecināt ziņojuma autentiskumu bez nepieciešamības izpaust šo informāciju. Praksē daudzi pakalpojumu sniedzēji un tīmekļa lietotnes glabā un izmanto jaucējkodus, kas ģenerēti, izmantojot paroles, nevis glabā paroles nešifrēta teksta veidā.
Noturība pret otro pirmtēlu
Vienkāršības labad varētu teikt, ka noturība pret otro pirmtēlu ir kaut kas pa vidu starp pirmām divām īpašībām. Otrā pirmtēla uzbrukums veidojas tad, ja kādam izdodas atrast konkrētus ievaddatus, kas ģenerē tādu pat rezultātu, kādu var iegūt ar citiem, jau zināmiem ievaddatiem.
Citiem vārdiem sakot, otrā pirmtēla uzbrukums nozīmē, ka tiek konstatēta sadursme, taču tā vietā, lai meklētu divas nejaušas ievaddatu kopas, kas ģenerētu vienādu jaucējkodu, tiek meklēti ievaddati, kas ģenerētu tādu pat jaucējkodu, kāds ir iegūts, izmantojot citus, konkrētus ievaddatus.
Tas nozīmē, ka jebkura jaucējfunkcija, kas ir noturīga pret sadursmēm, ir arī noturīga pret otrā pirmtēla uzbrukumiem, jo tajos vienmēr notiek sadursme. Tomēr pirmtēla uzbrukumu var veikt arī pret sadursmi noturīgām funkcijām, jo tas paredz atsevišķu ievaddatu meklēšanu, izmantojot atsevišķu rezultātu.
Ieguve
Bitcoin ieguves procesā ir vairākas darbības, kas ietver jaucējfunkciju izmantošanu, piemēram, kontu atlikumu pārbaude, darījumu sākuma un beigu datu saistīšana, kā arī darījumu jaukšana blokā, lai veidotu Merkles koku. Taču viens no galvenajiem iemesliem, kāpēc Bitcoin blokķēde ir droša, slēpjas faktā, ka ieguvējiem ir jāveic neskaitāmas jaukšanas darbības, lai varētu iegūt nākamajam blokam derīgu risinājumu.
Proti, ieguvējam ir jāizmēģina vairāki atšķirīgi ievaddati, lai varētu izveidot sava potenciālā bloka jaucējkodu. Būtībā ieguvējs varēs validēt savu bloku tikai tad, ja viņam izdosies iegūt jaucējkodu, kas sāksies ar noteiktu nuļļu skaitu. Nuļļu skaits nosaka ieguves procesa sarežģītību, un tas ir atkarīgs no tīklam paredzētā jaukšanas ātruma.
Šajā gadījumā jaukšanas ātrums raksturo to, cik daudz datora jaudas tiek ieguldīts Bitcoin ieguvē. Samazinoties tīkla jaukšanas ātrumam, Bitcoin protokols automātiski pielāgo ieguves sarežģītību, lai vidējais bloka ieguvei nepieciešamais laiks joprojām būtu aptuveni 10 minūtes. Turpretī, ja vairāki ieguvēji nolemj pārtraukt veikt ieguvi, kā rezultātā jaukšanas ātrums būtiski samazinās, ieguves sarežģītība tiek atbilstoši pielāgota, lai nodrošinātu vieglāku ieguves procesu (līdz vidējais bloka ieguves laiks atkal sasniedz 10 minūtes).
Jāpiebilst, ka ieguvējiem nav jāmeklē sadursmes, jo ir vairāki jaucējkodi, ko viņi var iegūt kā derīgu rezultātu (kas sākas ar noteiktu nuļļu skaitu). Tātad ir vairāki iespējamie risinājumi konkrētam blokam, un ieguvējiem ir jāatrod tikai viens no tiem – atbilstoši sliekšņvērtībai, ko nosaka ieguves sarežģītība.
Tā kā Bitcoin ieguve ietver lielas izmaksas, ieguvējiem nav motivācijas krāpties, jo tas radītu būtiskus finansiālus zaudējumus. Jo vairāk ieguvēju pievienojas blokķēdei, jo lielāka un spēcīgāka tā kļūst.
Noslēgumā
Nav šaubu, ka jaucējfunkcijas ir svarīgi rīki datorzinātnē, jo īpaši tad, ja ir jāapstrādā lieli datu apjomi. Apvienojumā ar kriptogrāfiju jaukšanas algoritmi var būt visai daudzpusīgi, piedāvājot drošību un autentifikācijas iespējas daudzos dažādos veidos. Līdz ar to kriptogrāfiskās jaucējfunkcijas ir ļoti svarīgas gandrīz visos kriptovalūtu tīklos, un izpratne par to īpašībām un darbības principiem noteikti var palīdzēt ikvienam, kuru interesē blokķēdes tehnoloģija.