paint-brush
Šifrēšana: šifri, apkopojumi, sāls un IV — tas, kas jums jāzinaautors@gliimlang
Jauna vēsture

Šifrēšana: šifri, apkopojumi, sāls un IV — tas, kas jums jāzina

autors Gliimly14m2025/01/04
Read on Terminal Reader

Pārāk ilgi; Lasīt

Šifrēšana ir metode datu pārvēršanai nederīgā formā, ko var padarīt noderīgu tikai ar atšifrēšanas palīdzību. Šeit jūs uzzināsit, kā šifrēt un atšifrēt datus, izmantojot paroli.
featured image - Šifrēšana: šifri, apkopojumi, sāls un IV — tas, kas jums jāzina
Gliimly HackerNoon profile picture

Kas ir šifrēšana?

Šifrēšana ir metode datu pārvēršanai nederīgā formā, ko var padarīt noderīgu tikai ar atšifrēšanas palīdzību. Mērķis ir padarīt datus pieejamus tikai tiem, kas var tos atšifrēt (ti, padarīt tos izmantojamus). Parasti dati ir jāšifrē, lai nodrošinātu, ka tos nevar iegūt nesankcionētas piekļuves gadījumā. Tā ir pēdējā aizsardzības līnija pēc tam, kad uzbrucējam ir izdevies izlauzties cauri autorizācijas sistēmām un piekļuves kontrolei.

Tas nenozīmē, ka visi dati ir jāšifrē, jo bieži vien var pietikt ar autorizācijas un piekļuves sistēmām, turklāt par datu šifrēšanu un atšifrēšanu tiek piemērots sods par veiktspēju. Ja un kad dati tiek šifrēti, tas ir lietojumprogrammu plānošanas un riska novērtēšanas jautājums, un dažreiz tā ir arī normatīva prasība, piemēram, ar HIPAA vai GDPR.

Datus var šifrēt miera stāvoklī, piemēram, diskā, vai pārsūtīšanas laikā, piemēram, starp divām pusēm, kas sazinās internetā.

Šeit jūs uzzināsit, kā šifrēt un atšifrēt datus, izmantojot paroli, ko sauc arī par simetrisko šifrēšanu. Šī parole ir jāzina abām informācijas apmaiņas pusēm.

Šifrs, Digest, Sāls, Iterācijas, IV

Lai pareizi un droši izmantotu šifrēšanu, ir jāpaskaidro daži jēdzieni.


Šifrs ir šifrēšanai izmantotais algoritms. Piemēram, AES256 ir šifrs. Ideja par šifru ir tas, ko lielākā daļa cilvēku domās, kad runa ir par šifrēšanu.


Īsavilkums būtībā ir jaucējfunkcija, ko izmanto, lai kodētu un pagarinātu paroli (ti, šifrēšanas atslēgu), pirms to izmanto šifrs. Kāpēc tas tiek darīts? Pirmkārt, tas rada labi nejaušinātu, vienāda garuma atslēgas jaucēju, kas labāk darbojas šifrēšanai. Tas ir ļoti piemērots arī "sālīšanai", kas ir nākamais, par ko runāt.


"Sāls" ir tā saukto "varavīksnes" galdu pārvarēšanas metode. Uzbrucējs zina, ka divas jauktās vērtības joprojām izskatīsies tieši tāpat, ja tās būtu oriģinālās. Tomēr, ja pievienojat jaukšanai sāls vērtību, tas netiks darīts. To sauc par "sāli", jo tas ir sajaukts ar atslēgu, lai iegūtu kaut ko citu.


Tagad varavīksnes tabula mēģinās saskaņot zināmās jauktās vērtības ar iepriekš aprēķinātiem datiem, cenšoties uzminēt paroli.


Parasti sāls tiek nejauši ģenerēts katrai atslēgai un saglabāts kopā ar to. Lai saskaņotu zināmos jaucējus, uzbrucējam būtu iepriekš jāaprēķina varavīksnes tabulas ļoti daudzām nejaušām vērtībām, kas parasti nav iespējams.

Jūs bieži dzirdēsit par "iterācijām" šifrēšanā. Iterācija ir viens cikls, kurā atslēga un sāls tiek sajauktas tā, lai apgrūtinātu atslēgas uzminēšanu. Tas tiek darīts daudzas reizes, lai uzbrucējam būtu skaitļošanas ziņā grūti uzminēt atslēgu, tātad "iterācijas" (daudzskaitlī). Parasti minimālais nepieciešamais atkārtojumu skaits ir 1000, taču tas var atšķirties no tā. Ja sākat ar patiešām spēcīgu paroli, parasti jums ir nepieciešams mazāk.

IV (vai "inicializācijas vektors") parasti ir nejauša vērtība, ko izmanto katra ziņojuma šifrēšanai. Tagad sāli izmanto atslēgas izgatavošanai, pamatojoties uz paroli. Un IV tiek izmantots, ja jums jau ir atslēga un tagad tiek šifrēti ziņojumi. IV mērķis ir panākt, lai tie paši ziņojumi tiktu šifrēti atšķirīgi. Dažreiz IV ir arī secīgs komponents, tāpēc tas ir izveidots no nejaušas virknes un secības, kas pastāvīgi palielinās.


Tas apgrūtina "atkārtošanas" uzbrukumus, jo uzbrucējam nav nepieciešams atšifrēt ziņojumu; drīzāk šifrēts ziņojums tika "izšņaukts" (ti, pārtverts starp sūtītāju un saņēmēju) un pēc tam atskaņots atkārtoti, cerot atkārtot jau veikto darbību. Lai gan patiesībā lielākajai daļai augsta līmeņa protokolu jau ir izveidota secība, kur katram ziņojumam kā daļai ir pieaugošs pakešu skaits, tāpēc vairumā gadījumu IV tas nav vajadzīgs.

Priekšnoteikumi

Šajā piemērā tiek izmantota Gliimly sistēma. Vispirms instalējiet to.

Šifrēšanas piemērs

Lai palaistu piemērus šeit, izveidojiet lietojumprogrammu "enc" savā direktorijā (skatiet mgrg , lai uzzinātu vairāk par Gliimly programmu pārvaldnieku):

 mkdir enc_example cd enc_example gg -k enc

Lai šifrētu datus, izmantojiet šifrēšanas datu paziņojumu. Vienkāršākā forma ir šifrēt virkni ar nulli. Izveidojiet failu "encrypt.gliim" un kopējiet šo:

 begin-handler /encrypt public set-string str = "This contains a secret code, which is Open Sesame!" // Encrypt encrypt-data str to enc_str password "my_password" p-out enc_str @ // Decrypt decrypt-data enc_str password "my_password" to dec_str p-out dec_str @ end-handler

Varat skatīt datu šifrēšanas un datu atšifrēšanas pamata lietojumu. Jūs sniedzat datus (oriģinālos vai šifrētos) un paroli, un jūs varat doties ceļā. Dati tiek šifrēti un pēc tam atšifrēti, iegūstot oriģinālu.

Avota kodā virknes mainīgais "enc_str" (kas tiek izveidots kā "char *") saturēs šifrētu "Tas satur slepeno kodu, kas ir Open Sesame!" un "dec_str" būs atšifrētie dati, kuriem ir jābūt tieši tādiem pašiem.

Lai palaistu šo kodu no komandrindas, vispirms izveidojiet lietojumprogrammu:

 gg -q

Pēc tam lieciet Gliimly izveidot bash kodu, lai to palaistu — pieprasījuma ceļš ir "/encrypt", ko mūsu gadījumā apstrādā funkcija "void encrypt()", kas definēta avota failā "encrypt.gliim". Programmā Gliimly šie nosaukumi vienmēr sakrīt, atvieglojot koda rakstīšanu, lasīšanu un izpildi. Izmantojiet opciju "-r" gg , lai norādītu pieprasījuma ceļu un iegūtu kodu, kas nepieciešams programmas palaišanai:

 gg -r --req="/encrypt" --silent-header --exec


Jūs saņemsit šādu atbildi:

 72ddd44c10e9693be6ac77caabc64e05f809290a109df7cfc57400948cb888cd23c7e98e15bcf21b25ab1337ddc6d02094232111aa20a2d548c08f230b6d56e9 This contains a secret code, which is Open Sesame!


Šeit ir šifrēti dati, un pēc tam šie šifrētie dati tiek atšifrēti, izmantojot to pašu paroli. Nav pārsteidzoši, ka rezultāts atbilst virknei, kuru vispirms šifrējāt.

Ņemiet vērā, ka pēc noklusējuma šifrēšanas dati veidos šifrētu vērtību cilvēkam lasāmā heksadecimālā formā, kas nozīmē, ka tie sastāv no heksadecimālajām rakstzīmēm “0” līdz “9” un “a” līdz “f”. Tādā veidā jūs varat saglabāt šifrētos datus parastā virknē. Piemēram, tas var nonākt JSON dokumentā, datu bāzes kolonnā VARCHAR vai gandrīz jebkur citur. Tomēr jūs varat arī izveidot bināri šifrētus datus. Vairāk par to mazliet.

Šifrējiet datus bināros rezultātos

Iepriekšējā piemērā iegūtie šifrētie dati ir cilvēkam lasāmā heksadecimālā formā. Varat arī izveidot bināri šifrētus datus, kas nav cilvēkiem lasāma virkne un ir arī īsāki. Lai to izdarītu, izmantojiet "bināro" klauzulu. Aizstāt kodu "encrypt.gliim" ar:

 begin-handler /encrypt public set-string str = "This contains a secret code, which is Open Sesame!" // Encrypt encrypt-data str to enc_str password "my_password" binary // Save the encrypted data to a file write-file "encrypted_data" from enc_str get-app directory to app_dir @Encrypted data written to file <<p-out app_dir>>/encrypted_data // Decrypt data decrypt-data enc_str password "my_password" binary to dec_str p-out dec_str @ end-handler

Ja vēlaties iegūt bināri šifrētus datus, jums ir jānorāda arī to garums baitos, pretējā gadījumā jūs nezināt, kur tie beidzas, jo tajos var būt nulles baiti. Šim nolūkam izmantojiet klauzulu "izvades garums". Šajā kodā mainīgā "enc_str" šifrētie dati tiek ierakstīti failā "encrypted_data", un rakstītais garums ir "outlen" baiti.


Ja fails ir rakstīts bez ceļa, tas vienmēr tiek ierakstīts lietojumprogrammas sākumdirektorijā (skatiet direktorijus ), tāpēc šī direktorija iegūšanai jāizmanto get-app .

Atšifrējot datus, ievērojiet, ka tiek izmantota klauzula "ievades garums". Tas norāda, cik baitu ir šifrētajiem datiem. Acīmredzot to var iegūt no mainīgā "outlen", kur encrypt-data saglabā šifrēto datu garumu. Kad šifrēšana un atšifrēšana ir atsaistītas, ti, darbojas atsevišķās programmās, jums jāpārliecinās, ka šis garums ir pieejams.

Ņemiet vērā arī to, ka, ja dati tiek šifrēti kā "bināri" (kas nozīmē bināras izvades izveidi), atšifrēšanai ir jāizmanto tas pats.

Izveidojiet pieteikumu:

 gg -q


Palaidiet to tāpat kā iepriekš:

 gg -r --req="/encrypt" --silent-header --exec


Rezultāts ir:

 Encrypted data written to file /var/lib/gg/enc/app/encrypted_data This contains a secret code, which is Open Sesame!


Atšifrētie dati ir tieši tādi paši kā oriģinālie dati.

Jūs varat redzēt faktiskos šifrētos datus, kas ierakstīti failā, izmantojot "octal dump" ("od") Linux utilītu:

 od -c /var/lib/gg/enc/app/encrypted_data


ar tādu rezultātu kā:

 $ od -c /var/lib/gg/enc/app/encrypted_data 0000000 r 335 324 L 020 351 i ; 346 254 w 312 253 306 N 005 0000020 370 \t ) \n 020 235 367 317 305 t \0 224 214 270 210 315 0000040 # 307 351 216 025 274 362 033 % 253 023 7 335 306 320 0000060 224 # ! 021 252 242 325 H 300 217 # \vm V 351 0000100

Tur jums tas ir. Jūs ievērosiet, ka dati ir bināri, un tie faktiski satur nulles baitu(-s).

Šifrēt bināros datus

Šajos piemēros šifrējamie dati ir virkne, ti, atdalīta ar nulli. Jūs varat šifrēt bināros datus tikpat vienkārši, norādot tos veselus (jo Gliimly seko baitu skaitam!) vai norādot to garumu klauzulā "input-length", piemēram, nokopējiet to uz "encrypt.gliim":

 begin-handler /encrypt public set-string str = "This c\000ontains a secret code, which is Open Sesame!" // Encrypt encrypt-data str to enc_str password "my_password" input-length 12 p-out enc_str @ // Decrypt decrypt-data enc_str password "my_password" to dec_str // Output binary data; present null byte as octal \000 string-length dec_str to res_len start-loop repeat res_len use i start-with 0 if-true dec_str[i] equal 0 p-out "\\000" else-if pf-out "%c", dec_str[i] end-if end-loop @ end-handler

Tas šifrēs 12 baitus atmiņas vietā “enc_str” neatkarīgi no nulles baitiem. Šajā gadījumā tas ir “This c”, kam seko nulles baits, kam seko “ontain” virkne, taču tie var būt jebkāda veida bināri dati, piemēram, JPG faila saturs.

Atšifrēšanas pusē jūs iegūtu baitu skaitu, kas atšifrēts klauzulā “izejas garums”. Visbeidzot, tiek parādīts, ka atšifrētie dati ir tieši oriģināls, un nulles baits tiek parādīts tipiskā oktālā attēlojumā.

Izveidojiet pieteikumu:

 gg -q


Palaidiet to tāpat kā iepriekš:

 gg -r --req="/encrypt" --silent-header --exec


Rezultāts ir:

 6bea45c2f901c0913c87fccb9b347d0a This c\000ontai


Šifrētā vērtība ir īsāka, jo arī šajā gadījumā dati ir īsāki, un rezultāts precīzi atbilst oriģinālam.

Izmantojiet jebkuru šifru vai apkopojumu

Šifrēšana, ko izmanto pēc noklusējuma, ir AES256 un SHA256 jaukšana no standarta OpenSSL bibliotēkas, kuras abas tiek plaši izmantotas kriptogrāfijā. Tomēr varat izmantot jebkuru pieejamo šifru un īssavilkumu (ti, hash), ko atbalsta OpenSSL (pat jūsu nodrošinātos pielāgotos).

Lai redzētu, kuri algoritmi ir pieejami, rīkojieties šādi komandrindā:

 #get list of cipher providers openssl list -cipher-algorithms #get list of digest providers openssl list -digest-algorithms


Šie divi nodrošinās šifrēšanas un sagremošanas (jaukšanas) algoritmu sarakstu. Daži no tiem var būt vājāki par Gliimly izvēlētajiem noklusējuma iestatījumiem, un citi var būt paredzēti tikai atpakaļsaderībai ar vecākām sistēmām. Tomēr citi var būt diezgan jauni, un tiem nebija pietiekami daudz laika, lai tos apstiprinātu tādā apjomā, kādu vēlaties.


Tāpēc esiet piesardzīgs, izvēloties šos algoritmus, un noteikti zināt, kāpēc maināt noklusējuma algoritmus. Tomēr šeit ir Camellia-256 (ti, "CAMELLIA-256-CFB1") šifrēšanas izmantošanas piemērs ar "SHA3-512" īssavilkumu. Aizstāt kodu "encrypt.gliim" ar:

 begin-handler /encrypt public set-string str = "This contains a secret code, which is Open Sesame!" // Encrypt data encrypt-data str to enc_str password "my_password" \ cipher "CAMELLIA-256-CFB1" digest "SHA3-512" p-out enc_str @ // Decrypt data decrypt-data enc_str password "my_password" to dec_str \ cipher "CAMELLIA-256-CFB1" digest "SHA3-512" p-out dec_str @ end-handler


Izveidojiet pieteikumu:

 gg -q


Palaidiet to:

 gg -r --req="/encrypt" --silent-header --exec


Šajā gadījumā rezultāts ir:

 f4d64d920756f7220516567727cef2c47443973de03449915d50a1d2e5e8558e7e06914532a0b0bf13842f67f0a268c98da6 This contains a secret code, which is Open Sesame!

Atkal jūs saņemat sākotnējos datus. Ņemiet vērā, ka jums ir jāizmanto viens un tas pats šifrs un īssavilkums gan datu šifrēšanai, gan atšifrēšanai!

Protams, jūs varat izveidot bināro šifrēto vērtību tāpat kā iepriekš, izmantojot "bināro" un "izejas garuma" klauzulas.

Ja jums ir ārējās sistēmas, kas šifrē datus, un zināt, kuru šifru un īssavilkumu tās izmanto, varat tās saskaņot un padarīt kodu sadarbspējīgu. Gliimly izmanto standarta OpenSSL bibliotēku, tāpēc pastāv iespēja, ka to var izmantot arī cita programmatūra.

Izmantojot sāli

Lai pievienotu sāli šifrēšanai, izmantojiet "sāls" klauzulu. Varat ģenerēt izlases sāli, izmantojot izlases virknes paziņojumu (vai izlases veida šifrēšanu, ja nepieciešams). Šeit ir kods "encrypt.gliim":

 begin-handler /encrypt public set-string str = "This contains a secret code, which is Open Sesame!" // Get salt random-string to rs length 16 // Encrypt data encrypt-data str to enc_str password "my_password" salt rs @Salt used is <<p-out rs>>, and the encrypted string is <<p-out enc_str>> // Decrypt data decrypt-data enc_str password "my_password" salt rs to dec_str p-out dec_str @ end-handler


Izveidojiet pieteikumu:

 gg -q


Palaidiet to dažas reizes:

 gg -r --req="/encrypt" --silent-header --exec gg -r --req="/encrypt" --silent-header --exec gg -r --req="/encrypt" --silent-header --exec


Rezultāts:

 Salt used is VA9agPKxL9hf3bMd, and the encrypted string is 3272aa49c9b10cb2edf5d8a5e23803a5aa153c1b124296d318e3b3ad22bc911d1c0889d195d800c2bd92153ef7688e8d1cd368dbca3c5250d456f05c81ce0fdd This contains a secret code, which is Open Sesame! Salt used is FeWcGkBO5hQ1uo1A, and the encrypted string is 48b97314c1bc88952c798dfde7a416180dda6b00361217ea25278791c43b34f9c2e31cab6d9f4f28eea59baa70aadb4e8f1ed0709db81dff19f24cb7677c7371 This contains a secret code, which is Open Sesame! Salt used is nCQClR0NMjdetTEf, and the encrypted string is f19cdd9c1ddec487157ac727b2c8d0cdeb728a4ecaf838ca8585e279447bcdce83f7f95fa53b054775be1bb2de3b95f2e66a8b26b216ea18aa8b47f3d177e917 This contains a secret code, which is Open Sesame!

Kā redzat, katrai šifrēšanai tiek ģenerēta nejauša sāls vērtība (šajā gadījumā 16 baiti), un šifrētā vērtība katru reizi ir atšķirīga, lai gan šifrētie dati bija vienādi! Tas apgrūtina šādas šifrēšanas uzlauzšanu.

Protams, lai atšifrētu, sāls ir jāieraksta un jāizmanto tieši tāpat kā šifrējot. Šeit esošajā kodā mainīgais "rs" satur sāli. Ja saglabājat šifrētās vērtības datu bāzē, jūs, iespējams, glabāsit sāli tieši blakus tai.

Inicializācijas vektors

Praksē katram ziņojumam nevajadzētu izmantot citu sāls vērtību. Tas katru reizi izveido jaunu atslēgu, un tas var samazināt veiktspēju. Un tas tiešām nav nepieciešams: sāls izmantošana padara katru taustiņu (pat to pašu) daudz grūtāk uzminējamu. Kad esat to izdarījis, iespējams, jums tas vairs nebūs jādara atkārtoti vai bieži.

Tā vietā katram ziņojumam izmantojiet IV (inicializācijas vektoru). Parasti tā ir nejauša virkne, kas liek tiem pašiem ziņojumiem izskatīties atšķirīgi un palielina paroles uzlaušanas skaitļošanas izmaksas. Šeit ir jaunais kods "encrypt.gliim":

 begin-handler /encrypt public // Get salt random-string to rs length 16 // Encrypt data start-loop repeat 10 use i start-with 0 random-string to iv length 16 encrypt-data "The same message" to enc_str password "my_password" salt rs iterations 2000 init-vector iv cache @The encrypted string is <<p-out enc_str>> // Decrypt data decrypt-data enc_str password "my_password" salt rs iterations 2000 init-vector iv to dec_str cache p-out dec_str @ end-loop end-handler


Izveidojiet pieteikumu:

 gg -q


Palaidiet to dažas reizes:

 gg -r --req="/encrypt" --silent-header --exec gg -r --req="/encrypt" --silent-header --exec gg -r --req="/encrypt" --silent-header --exec


Rezultāts var būt:

 The encrypted string is 787909d332fd84ba939c594e24c421b00ba46d9c9a776c47d3d0a9ca6fccb1a2 The same message The encrypted string is 7fae887e3ae469b666cff79a68270ea3d11b771dc58a299971d5b49a1f7db1be The same message The encrypted string is 59f95c3e4457d89f611c4f8bd53dd5fa9f8c3bbe748ed7d5aeb939ad633199d7 The same message The encrypted string is 00f218d0bbe7b618a0c2970da0b09e043a47798004502b76bc4a3f6afc626056 The same message The encrypted string is 6819349496b9f573743f5ef65e27ac26f0d64574d39227cc4e85e517f108a5dd The same message The encrypted string is a2833338cf636602881377a024c974906caa16d1f7c47c78d9efdff128918d58 The same message The encrypted string is 04c914cd9338fcba9acb550a79188bebbbb134c34441dfd540473dd8a1e6be40 The same message The encrypted string is 05f0d51561d59edf05befd9fad243e0737e4a98af357a9764cba84bcc55cf4d5 The same message The encrypted string is ae594c4d6e72c05c186383e63c89d93880c8a8a085bf9367bdfd772e3c163458 The same message The encrypted string is 2b28cdf5a67a5a036139fd410112735aa96bc341a170dafb56818dc78efe2e00 The same message

Varat redzēt, ka viens un tas pats ziņojums šifrētā veidā izskatās savādāk, taču atšifrēts tas atkal ir tāds pats. Protams, parolei, sāls, iterāciju skaitam un init vektoram ir jābūt vienādam gan šifrēšanai, gan atšifrēšanai.

Ņemiet vērā, ka tiek izmantota klauzula "kešatmiņa" datu šifrēšanai un datu atšifrēšanai. Tas efektīvi saglabā aprēķināto atslēgu kešatmiņā (norādītā parole, sāls, šifrēšanas/ievilkuma algoritmi un iterāciju skaits), tāpēc tā netiek aprēķināta katru reizi, izmantojot cilpu. Izmantojot "kešatmiņu", atslēga tiek aprēķināta vienreiz, un pēc tam katram ziņojumam tiek izmantots cits IV (klauzulā "init-vector".

Ja vēlaties laiku pa laikam atjaunot atslēgu, izmantojiet klauzulu "clear-cache", kas nodrošina Būla vērtību. Ja ir taisnība, atslēga tiek pārrēķināta, pretējā gadījumā tā tiek atstāta viena. Lai uzzinātu vairāk par to, skatiet šifrēšanas datus .

Secinājums

Jūs esat iemācījies šifrēt un atšifrēt datus, izmantojot dažādus šifrus, īssavilkumus, sāls un IV vērtības pakalpojumā Gliimly. Varat arī izveidot cilvēkiem lasāmu šifrētu vērtību un bināro izvadi, kā arī šifrēt gan virknes, gan binārās vērtības (piemēram, dokumentus).