Kā izveidot šifrēšanas izomorfu bibliotēku, izmantojot Javascript un WebAssembly

Atzīsimies: mums patīk noslēpumi. Mēs dalāmies noslēpumos ar labākajiem draugiem, mēs glabājam noslēpumus no vecākiem un rakstām slepenus žurnālus, lai pastāstītu viņiem savas dziļākās domas. Gadsimtu gaitā šī dabiskā tieksme no dažu matemātiķu vājuma ir pārtapusi par reālu zinātni, ko māca universitātēs visā pasaulē. Agrāk noslēpumu glabāšanas mākslu, ko mēs tagad saucam par kriptogrāfiju, gandrīz tikai izmantoja, lai privāti apmainītos ar informāciju starp valstīm. Mūsdienās tas ir visuresošs.

“Pasaule darbojas uz kodiem un šifriem, Džon. Sākot no miljonu mārciņu drošības sistēmas bankā līdz Pin mašīnai, kurai jūs izmantojāt izņēmumu. Kriptogrāfija apdzīvo katru mūsu nomoda brīdi ”- Šerloks Holmss

Ar interneta parādīšanos privātums ir kļuvis par galveno problēmu. Otrā pasaules kara laikā Enigma mašīnām bija izšķiroša nozīme, lai noteiktu Vācijas triumfu un sakāvi. Bet interneta laikmetā informācija ir sākotnēji digitāla, un katrs dators ir īpaši moderna Enigma mašīna. Tad nav pārsteidzoši, ka mēs esam iekļāvuši kodā savu vēlmi pēc slepenības, uzticot datorsistēmām pašas glabāt noslēpumus mūsu vārdā. Slepenības māksla nav tikai ciparu zagšana no ienaidnieka lauka; drīzāk runa ir par tādu mašīnu būvēšanu, kuras spēj sazināties savā starpā, nevienai trešajai pusei neatšifrējot ziņojumu. Mūsdienās kriptogrāfija ir kļuvusi par neaizstājamu informācijas aizsardzības instrumentu: mūsu bankas kontu, e-pastus, tiešsaistes pārlūkošanas paradumus, tos visus nodrošina kriptogrāfija. Pielietojumu klāsts ir milzīgs. Kriptogrāfiskā saziņa tiek izmantota, lai privāti apmainītos ar ziņojumiem no jūdžu attāluma tikai sekundes daļu, kā arī lai droši saglabātu personas datus, kurus mēs vienatnē varētu nolasīt. Mūsdienu pasaulē kriptogrāfija ir līme, kas notur pasauli piestiprinātu.

Šajā kontekstā privātums nenozīmē tikai brīvību no sabiedrības kontroles, bet arī personisko drošību, un tas patiešām ir cilvēka pamattiesības, un tas kā tāds ir jāaizsargā.

Svētā Grāla meklējumi tīmekļa kriptogrāfijas bibliotēkās

Šeit, Cubbit, mums ir sapnis par datu infrastruktūras decentralizāciju, un mums tas ir vajadzīgs tīmekļa lietojumprogrammā, kurā lietotāji var saglabāt un piekļūt saviem failiem no jebkuras vietas pasaulē. Tāpēc mēs sākām pieejamo tīmekļa kriptogrāfijas bibliotēku meklēšanu, kas darbojas pārlūkprogrammā. Lai gan gadu gaitā parādījās daudz no tiem, neviens neatbilda mūsu vajadzībām attiecībā uz šifrēšanas ātrumu un lietojamību trīs galveno iemeslu dēļ:

  • Pārāk sarežģītas API.
  • Sliktas izrādes, šifrējot / atšifrējot failus (kriptogrāfija ir skaitļošanas ziņā intensīva lietojumprogramma, un Javascript tā parasti ir bijusi slikta).
  • Trūkst standartu, kas mums nepieciešami, lai izveidotu savu kriptogrāfijas arhitektūru.

Iemesls # 0: tīmekļa kriptogrāfijas bibliotēkas tiek izmantotas nepatiesi

Izpētīsim šos iemeslus padziļināti.

Pirmkārt, mēs pieņemam, ka OpenSSL ir de facto kriptogrāfijas standarts, ņemot vērā, ka daudzi uzņēmumi to pieņem savā drošības darbplūsmā. Tomēr, tā kā tas tika uzrakstīts C valodā, tam ir šausmīgi API paraksti un tas joprojām ir vāji dokumentēts, padarot tā mācīšanās līkni stāvāku nekā citas tehnoloģijas. Tātad, visas topošās šifrēšanas bibliotēkas cenšas uzturēt savu kodu bāzi pēc iespējas saderīgāku ar OpenSSL, kā rezultātā viņu API netiek vienkāršota jauniem izstrādātājiem.

1. iemesls: šifrēšana tīmeklī ir nedroša un lēna

Otrkārt, tīmekļa tehnoloģiju attīstības rezultātā pārlūkprogrammas vienkāršības labad ir pieņēmušas tikai Javascript. Neskatoties uz to, Javascript nav labākā valoda smagu skaitļošanas uzdevumu veikšanai, un, uzmini, kriptogrāfija ir sarežģīts skaitļošanas uzdevums. Turklāt, ņemot vērā tā arvien plašāko pieņemšanu, tā bieži ir daudzo topošo izstrādātāju pirmā izvēle pēc viņu pirmās pieredzes. Rezultāts: daudzi no viņiem sāka rakstīt sliktu kodu, padarot valodu pilnu ar drošības jautājumiem.

2. iemesls: daudzās bibliotēkās trūkst atbalsta ECC un citiem standartiem

Visbeidzot, nevienā no mūsu atrastajām bibliotēkām nav iekļauti visi standarta algoritmi, kas mums jāīsteno; piemēram, neviens neatbalstīja eliptisko līkņu kriptogrāfiju. Turklāt katrs no tiem ir piemērots noteiktam šifrēšanas protokolam vairāk nekā citi, un mēs izmantojam daudz šifrēšanas protokolu.

Sāksim

Lai pārvarētu visas šīs problēmas, mēs sākām attīstīt savu kriptogrāfijas bibliotēku. Mēs to izstrādājām, ņemot vērā trīs skaidrus mērķus:

  1. Izomorfisms
  2. Failu šifrēšanas ātrums
  3. Nekad neizgudrojiet riteni, ja vien tas nav kvadrātā

Izomorfisms attiecas uz universālā koda jēdzienu, t.i., rakstīt vienreiz, palaist jebkur.

Failu šifrēšanas ātrums nozīmē, ka mūsu šifrēšanas bibliotēkai jābūt ātrai failu šifrēšanai, lai nodrošinātu vislabāko iespējamo lietotāja pieredzi.

Trešais princips ir mūsu pieeja kodam. Citiem vārdiem sakot, tā kā laiks ir visvērtīgākais resurss Visumā, to nekad nevajadzētu tērēt, ja jau pastāv efektīvi risinājumi. Nevajadzētu arī izšķiest, ja viņi to nedara, mēģinot izdalīt asinis no akmens. Jauna risinājuma izveidošana šādā gadījumā vienmēr ir labākais un ātrākais ceļš.

Tīmeklī

Mēs stundām un stundām ilgi meklējām bibliotēku ar nepieciešamajām funkcijām un izrādēm bez panākumiem. Tāpēc mēs nolēmām izmēģināt kompilācijas ceļu.

Kas? Sastādīt Javascript? Kā?

Paldies Emscripten!

Emscripten ir diezgan jauna tehnoloģija ar ļoti interesantu norādi, atsaucoties uz:

Emscripten ir rīku ķēde kompilēšanai asm.js un WebAssembly, kas veidota, izmantojot LLVM, kas ļauj palaist C un C ++ tīmeklī gandrīz vietējā ātrumā bez spraudņiem.

Izmēģināšanas vērts, vai nedomājat?

Mēs sākām no ED25519 ieviešanas. Emscripten ir sava bibliotēka, kas jāiekļauj iesiejumos.

Svarīgs apsvērums ir par atmiņas pārvaldību. Javascript pasaulē mēs kā izstrādātāji esam pieraduši ticēt lielākajam atkritumu savācējam, kas ļauj mums vienkārši ignorēt visus ar atmiņu saistītos aspektus. Bet, lai veiksmīgi izmantotu Emscripten kodu, mēs esam spiesti rūpēties par koplietojamo atmiņu bez malloc un bez maksas.

const heap_seed = em_array_malloc ((sevi kā jebkuru) .enigma, sēkla);
ED25519.create_keypair (heap_seed.byteOffset, seed.length);
em_array_free ((pats kā jebkurš) .enigma, kaudzes_sēkla);

Ar šo darba rezultātu somā mēs pārcēlāmies uz citu tēmu: AES straumēšanas režīms. Pētījuma laikā mēs neatradām ļoti labas izrādes, tāpēc mēs izvēlamies izmēģināt ar OpenSSL. Tas nozīmēja, ka kodu bāze bija jāapkopo ar Emscripten; diemžēl trūka dokumentācijas. Tātad pēc kāda laika mēs empīriski atradām procedūru rezultātu sasniegšanai,

tas ir, šādas darbības:

  1. Izslēdziet visus šifrus, kas nav stingri nepieciešami
  2. Šķērsot
  3. Saite ar savu kodu

Un…

Vietnē Node.js

Typescript, korporācijas Microsoft ierakstītais Javascript superkomplekts, ir šeit, Kubbitā esošās tehnoloģiju paketes pavards. Tādējādi būtu bijis dabiski veidot kriptogrāfijas kaudzi arī Typescript. Tomēr izrādes un kriptogrāfija lieliski der dzimtajām valodām, piemēram, C ++, savukārt, kā mēs jau teicām, Typescript nav piemērots uzdevumam.

Tāpēc mēs nolēmām par galveno valodu izmantot Node.js, jo tā ļauj mums izmantot papildinājumus, lai viegli integrētu vietējos kodus. Šajā sakarā N-API ir lielisks Node.js komandas rīks, API, kas ir stabils visās Node.js versijās: vienkārši izveidojiet vienreiz un tas darbosies katrā jaunākā lielākajā versijā bez atkārtotas apkopošanas.

Turklāt tas ir diezgan vienkārši lietojams:

Vienkārši iesaiņojiet un eksportējiet objektus un funkcijas, kuras vēlaties koplietot ar Javascript pasauli, un ļaujiet kompilatoram veikt smagu darbu jūsu vietā.

Enigma, ātra universāla šifrēšanas bibliotēka

Un tā, pēc dažu mēnešu pētījumu un kodēšanas, Enigma bija atdzīvojusies.

Enigma ir šifrēšanas bibliotēka, kas izstrādāta, lai efektīvi darbotos pārlūkprogrammās, izmantojot efektīvas tehnoloģijas, piemēram, WebCrypto un WebAssembly. Mūsu mērķis ir nodrošināt galvenos šifrēšanas standarta algoritmus, kā arī utilītu komplektu, lai vienkāršotu izmantošanu “standarta” izstrādātājam.

Lai vēl vairāk atvieglotu tā pieņemšanu, mēs Enigma padarījām izomorfisku, t.i., saderīgu gan ar Node.js, gan ar Web, lai padarītu to sadarbspējīgu, nemainot vienu koda rindu. Kodam vajadzētu būt universālam saskaņā ar WORA devīzi, t.i., “rakstīt vienreiz, palaist jebkur”.

Kā to izmantot

Tagad jūs varat teikt: “Ok, forši! Bet kā es varu to izmantot? ”Pirmkārt, tas jāinstalē. Tā kā Enigma ir NPM modulis, jūs terminālī varat vienkārši ievadīt šādu komandu:

npm instalēt @ cubbit / mīkla

vai, ja vēlaties dziju:

dzija pievienot @ cubbit / mīkla

Tagad Enigma ir instalēta un ir daļa no jūsu atkarībām.

Tad ir laiks to sākt lietot!

Pieņemsim, ka vēlaties šifrēt ziņojumu ar AES-256 (vienkārši, lai sāktu). Te nu mēs esam. Pirmkārt, mums jāinicializē Enigma. Tā kā veiktspējas uzlabošanai tiek izmantots vietējais kods, mums jāgaida pārlūkprogramma, lai to ielādētu, pirms mēs varam sākt izmantot bibliotēku.

PIEZĪME: Šis kods ir rakstīts mašīnrakstā, bet, protams, varat rakstīt arī tīrā Javascript!

Mūsu mērķis šeit ir šifrēt vienkāršu teksta virkni.

Uzmanieties, tā kā AES256 ir simetrisks šifrēšanas algoritms, mums ir jāizmanto tā pati atslēga, kuru mēs izmantojām, lai šifrētu ziņojumu, lai to atšifrētu. Kaut kas kā:

Teiksim, tagad mēs vēlamies šifrēt failu pirms tā nosūtīšanas tīklā. Jā, jums jāzina, ka lielākajai daļai esošo pārlūkprogrammu ir ierobežojumi attiecībā uz maksimālo atmiņu, ko Web lapa var atvēlēt. Piemēram, pārlūks Google Chrome var atvēlēt ne vairāk kā 1,5 GB RAM. Arī parasti bloķēšanas šifrēšanas algoritmi darbojas labāk ar maziem datu gabaliem. Līdz ar to nav ieteicams šifrēt visu failu, bet gan to šifrēt pakāpeniski. Šajā laukā Node.js ir ļoti ērts un labi izstrādāts rīks datu plūsmu manipulēšanai: objekts Straume. Tāpēc mēs iedvesmojāmies no tā, lai nodrošinātu nemanāmu API.

Šāda veida sintakse ir tāda, ka jūs varat pievienot caurules kopā, lai automātiski nosūtītu šifrētu failu tīklā, kamēr tas tiek šifrēts. Burvju! :)

file_stream.pipe (aes_stream) .pipe (socket);

Enigma nodrošina daudz vairāk funkciju, tāpēc, ja jūs interesē, droši apmeklējiet tās krātuvi un sniedziet savu ieguldījumu.

Rezultāti

Mēs izmantojam etalonu komplektu, lai Enigma salīdzinātu ar citām esošajām tīmekļa bibliotēkām. Šie ir rezultāti (Chrome 72 ierīcē I7-7820HQ - zemāks ir labāks):

AES šifrēšana. Zemāks ir labāks

Kā redzat, Enigma darbojas vislabāk, šifrējot un apstrādājot failus, nevis šifrējot mazas virknes. Faktiski mēs ieviešam nelielu piemaksu, ielādējot tīmekļa montāžas bināros failus, taču tas mainās spēles laikā, kad mums ir nepieciešams šifrēt lielāku datu daudzumu, piemēram, failus.

Mūsu redzējums par Enigma nākotni

Mūsu mērķis ir izveidot gan spēcīgu, gan vienkāršu kriptogrāfijas bibliotēku.

Mēs turpināsim iesaiņot bibliotēkas ar mūsu API, lai ieviestu vairāk algoritmu un sasniegtu labākus rezultātus. Mēs esam izstrādājuši Enigma, ņemot vērā lietojamību un veiktspēju, un mēs strādāsim pie tā uzlabošanas.

PS. Enigma ir izstrādāta kā Cubbit kriptogrāfijas slānis, kas tagad sāk savu izplatīto mākoni. Ja vēlaties uzzināt vairāk, pārbaudiet to šeit.