Ang pag-encrypt ay isang paraan ng paggawa ng data sa isang hindi nagagamit na anyo na maaaring gawing kapaki-pakinabang lamang sa pamamagitan ng pag-decryption. Ang layunin ay gawing available lamang ang data sa mga makakapag-decrypt nito (ibig sabihin, gawin itong magagamit). Karaniwan, kailangang i-encrypt ang data upang matiyak na hindi ito makukuha sa kaso ng hindi awtorisadong pag-access. Ito ang huling linya ng depensa pagkatapos na makalusot ang isang umaatake sa mga sistema ng awtorisasyon at kontrol sa pag-access.
Hindi ito nangangahulugan na ang lahat ng data ay kailangang ma-encrypt, dahil kadalasan, ang mga sistema ng pahintulot at pag-access ay maaaring sapat, at bilang karagdagan, mayroong isang parusa sa pagganap para sa pag-encrypt at pag-decrypt ng data. Kung at kapag na-encrypt ang data ay isang usapin ng pagpaplano ng aplikasyon at pagtatasa ng panganib, at kung minsan, kinakailangan din ito ng regulasyon, gaya ng sa HIPAA o GDPR.
Maaaring i-encrypt ang data sa pahinga, tulad ng sa disk, o sa transit, tulad ng sa pagitan ng dalawang partido na nakikipag-usap sa Internet.
Dito, matututunan mo kung paano i-encrypt at i-decrypt ang data gamit ang isang password, na kilala rin bilang simetriko na pag-encrypt. Ang password na ito ay dapat na alam ng parehong partido na nagpapalitan ng impormasyon.
Upang maayos at ligtas na magamit ang pag-encrypt, may ilang mga ideya na kailangang ipaliwanag.
Ang cipher ay ang algorithm na ginagamit para sa pag-encrypt. Halimbawa, ang AES256 ay isang cipher. Ang ideya ng isang cipher ay kung ano ang iisipin ng karamihan sa mga tao pagdating sa pag-encrypt.
Ang digest ay karaniwang isang hash function na ginagamit upang i-scramble at pahabain ang password (ibig sabihin, ang encryption key) bago ito gamitin ng cipher. Bakit ito ginagawa? Para sa isa, lumilikha ito ng well-randomized, pare-parehong haba ng hash ng isang key na mas gumagana para sa pag-encrypt. Ito ay angkop din para sa "pag-aasin", na siyang susunod na pag-uusapan.
Ang "asin" ay isang paraan ng pagtalo sa tinatawag na "bahaghari" na mga talahanayan. Alam ng isang umaatake na ang dalawang hash na halaga ay magkapareho pa rin ng hitsura kung ang mga orihinal. Gayunpaman, kung idaragdag mo ang halaga ng asin sa pag-hash, hindi nila gagawin. Ito ay tinatawag na "asin" dahil ito ay uri ng halo-halong may susi upang makagawa ng kakaiba.
Ngayon, susubukang itugma ng rainbow table ang mga kilalang halaga ng hashed sa na-precomputed na data sa pagsisikap na hulaan ang isang password.
Karaniwan, ang asin ay random na nabuo para sa bawat susi at nakaimbak kasama nito. Upang tumugma sa mga kilalang hash, kailangang i-precompute ng attacker ang mga rainbow table para sa napakaraming random na value, na sa pangkalahatan ay hindi magagawa.
Madalas mong marinig ang tungkol sa "mga pag-ulit" sa pag-encrypt. Ang pag-ulit ay isang solong cycle kung saan ang isang susi at asin ay pinaghalo sa paraang mas mahirap hulaan ang susi. Ginagawa ito ng maraming beses upang gawing mahirap sa pagkalkula para sa isang umaatake na baligtarin-hulaan ang susi, kaya "mga pag-ulit" (pangmaramihang). Karaniwan, ang minimum na kinakailangang bilang ng mga pag-ulit ay 1000, ngunit maaari itong maging iba kaysa doon. Kung nagsimula ka sa isang talagang malakas na password, sa pangkalahatan ay kailangan mo ng mas kaunti.
Ang IV (o "Initialization Vector") ay karaniwang isang random na halaga na ginagamit para sa pag-encrypt ng bawat mensahe. Ngayon, ang asin ay ginagamit para sa paggawa ng isang susi batay sa isang password. At ginagamit ang IV kapag mayroon ka nang susi at ngayon ay nag-e-encrypt ng mga mensahe. Ang layunin ng IV ay gawing kakaiba ang hitsura ng parehong mga mensahe kapag naka-encrypt. Minsan, ang IV ay mayroon ding sequential component, kaya ito ay gawa sa isang random na string kasama ang isang sequence na patuloy na tumataas.
Ginagawa nitong mahirap ang mga "replay" na pag-atake, kung saan hindi kailangang i-decrypt ng umaatake ang isang mensahe; sa halip, ang isang naka-encrypt na mensahe ay "na-sniff" (ibig sabihin, naharang sa pagitan ng nagpadala at tagatanggap) at pagkatapos ay ni-replay, umaasang maulit ang aksyon na nagawa na. Bagama't sa katotohanan, karamihan sa mga high-level na protocol ay mayroon nang pagkakasunod-sunod, kung saan ang bawat mensahe ay, bilang bahagi nito, ng isang pagtaas ng packet number, kaya sa karamihan ng mga kaso ay hindi ito kailangan ng IV.
Ang halimbawang ito ay gumagamit ng Gliimly framework. I-install muna ito.
Upang patakbuhin ang mga halimbawa dito, lumikha ng isang application na "enc" sa sarili nitong direktoryo (tingnan ang mgrg para sa higit pa sa program manager ni Gliimly):
mkdir enc_example cd enc_example gg -k enc
Upang i-encrypt ang data, gumamit ng encrypt-data statement. Ang pinakasimpleng anyo ay ang pag-encrypt ng isang null-terminated string. Gumawa ng file na "encrypt.gliim" at kopyahin ito:
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
Makikita mo ang pangunahing paggamit ng encrypt-data at decrypt-data . Nagbibigay ka ng data (orihinal o naka-encrypt) at ang password, at umalis ka. Ang data ay naka-encrypt at pagkatapos ay na-decrypt, na nagbubunga ng orihinal.
Sa source code, ang string variable na "enc_str" (na nilikha bilang "char *") ay maglalaman ng naka-encrypt na bersyon ng "Naglalaman ito ng isang lihim na code, na Open Sesame!" at ang "dec_str" ang magiging decrypted na data na dapat ay eksaktong pareho.
Upang patakbuhin ang code na ito mula sa command line, gawin muna ang application:
gg -q
Pagkatapos ay ipagawa kay Gliimly ang bash code upang patakbuhin ito - ang path ng kahilingan ay "/encrypt", na, sa aming kaso, ay pinangangasiwaan ng function na "void encrypt()" na tinukoy sa source file na "encrypt.gliim". Sa Gliimly, palaging magkatugma ang mga pangalang ito, na ginagawang madali ang pagsulat, pagbabasa, at pag-execute ng code. Gamitin ang "-r" na opsyon sa gg upang tukuyin ang path ng kahilingan at makuha ang code na kailangan mo para patakbuhin ang program:
gg -r --req="/encrypt" --silent-header --exec
Makakakuha ka ng tugon tulad nito:
72ddd44c10e9693be6ac77caabc64e05f809290a109df7cfc57400948cb888cd23c7e98e15bcf21b25ab1337ddc6d02094232111aa20a2d548c08f230b6d56e9 This contains a secret code, which is Open Sesame!
Ang mayroon ka rito ay ang naka-encrypt na data, at ang naka-encrypt na data na ito ay na-decrypt gamit ang parehong password. Hindi nakakagulat, ang resulta ay tumutugma sa string na iyong na-encrypt sa unang lugar.
Tandaan na bilang default, ang encrypt-data ay gagawa ng naka-encrypt na halaga sa isang nababasa ng tao na hexadecimal form, na nangangahulugang binubuo ng mga hexadecimal na character na "0" hanggang "9" at "a" hanggang "f". Sa ganitong paraan, maaari mong iimbak ang naka-encrypt na data sa isang regular na string. Halimbawa, maaari itong pumunta sa isang dokumento ng JSON, sa isang column ng VARCHAR sa isang database, o halos kahit saan pa. Gayunpaman, maaari ka ring gumawa ng binary na naka-encrypt na data. Higit pa sa na sa kaunti.
Sa nakaraang halimbawa, ang resultang naka-encrypt na data ay nasa isang hexadecimal na form na nababasa ng tao. Maaari ka ring lumikha ng binary na naka-encrypt na data, na hindi isang string na nababasa ng tao at mas maikli din. Upang gawin iyon, gamitin ang sugnay na "binary". Palitan ang code sa "encrypt.gliim" ng:
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
Kapag gusto mong makakuha ng binary na naka-encrypt na data, dapat mo ring makuha ang haba nito sa mga byte, o kung hindi man, hindi mo malalaman kung saan ito magtatapos, dahil maaaring naglalaman ito ng mga null byte. Gamitin ang sugnay na "output-length" para sa layuning iyon. Sa code na ito, ang naka-encrypt na data sa variable na "enc_str" ay isinulat sa file na "encrypted_data", at ang haba na nakasulat ay "outlen" bytes.
Kapag ang isang file ay isinulat nang walang path, ito ay palaging nakasulat sa application home directory (tingnan ang mga direktoryo ), kaya gagamitin mo ang get-app upang makuha ang direktoryong iyon.
Kapag nagde-decrypt ng data, pansinin ang paggamit ng "input-length" na sugnay. Sinasabi nito kung gaano karaming mga byte ang naka-encrypt na data. Malinaw, makukuha mo iyon mula sa variable na "outlen", kung saan iniimbak ng encrypt-data ang haba ng naka-encrypt na data. Kapag na-decoupled ang encryption at decryption, ibig sabihin, tumatakbo sa magkahiwalay na mga program, tinitiyak mong magagamit ang haba na ito.
Pansinin din na kapag ang data ay naka-encrypt bilang "binary" (ibig sabihin ay gumagawa ng binary output), ang decryption ay dapat gumamit ng pareho.
Gumawa ng aplikasyon:
gg -q
Patakbuhin ito tulad ng dati:
gg -r --req="/encrypt" --silent-header --exec
Ang resulta ay:
Encrypted data written to file /var/lib/gg/enc/app/encrypted_data This contains a secret code, which is Open Sesame!
Ang na-decrypt na data ay eksaktong kapareho ng orihinal.
Maaari mong makita ang aktwal na naka-encrypt na data na nakasulat sa file sa pamamagitan ng paggamit ng "octal dump" ("od") Linux utility:
od -c /var/lib/gg/enc/app/encrypted_data
na may resulta tulad ng:
$ 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
Nandiyan ka na. Mapapansin mong binary ang data, at talagang naglalaman ito ng (mga) null byte.
Ang data na ie-encrypt sa mga halimbawang ito ay isang string, ibig sabihin, null-delimited. Maaari mong i-encrypt ang binary data nang kasingdali sa pamamagitan ng pagtukoy nito nang buo (dahil sinusubaybayan ni Gliimly kung gaano karaming mga byte ang naroon!) o pagtukoy sa haba nito sa clause na "input-length", halimbawa, kopyahin ito sa "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
Ie-encrypt nito ang 12 byte sa lokasyon ng memory na "enc_str" anuman ang anumang null byte. Sa kasong ito, iyon ay "Itong c" na sinusundan ng isang null byte na sinusundan ng isang "ontain" na string, ngunit maaari itong maging anumang uri ng binary data, halimbawa, ang mga nilalaman ng isang JPG file.
Sa gilid ng pag-decrypt, makukuha mo ang bilang ng mga byte na na-decrypt sa clause na "haba ng output." Sa wakas, ang na-decrypt na data ay ipinapakita na eksakto ang orihinal, at ang null byte ay ipinakita sa isang tipikal na octal na representasyon.
Gumawa ng aplikasyon:
gg -q
Patakbuhin ito tulad ng dati:
gg -r --req="/encrypt" --silent-header --exec
Ang resulta ay:
6bea45c2f901c0913c87fccb9b347d0a This c\000ontai
Ang naka-encrypt na halaga ay mas maikli dahil ang data ay mas maikli din sa kasong ito, at ang resulta ay eksaktong tumutugma sa orihinal.
Ang encryption na ginamit bilang default ay AES256 at SHA256 hashing mula sa karaniwang OpenSSL library, na parehong malawakang ginagamit sa cryptography. Gayunpaman, maaari mong gamitin ang anumang magagamit na cipher at digest (ibig sabihin, hash) na sinusuportahan ng OpenSSL (kahit na ang mga custom na ibinigay mo).
Upang makita kung aling mga algorithm ang magagamit, gawin ito sa command line:
#get list of cipher providers openssl list -cipher-algorithms #get list of digest providers openssl list -digest-algorithms
Ang dalawang ito ay magbibigay ng isang listahan ng cipher at digest (hash) algorithm. Ang ilan sa mga ito ay maaaring mas mahina kaysa sa mga default na pinili ni Gliimly, at ang iba ay maaaring naroroon para lamang sa pabalik na pagkakatugma sa mga mas lumang system. Gayunpaman, ang iba ay maaaring medyo bago at walang sapat na oras upang ma-validate sa lawak na maaaring gusto mo sa kanila.
Kaya, mag-ingat sa pagpili ng mga algorithm na ito, at siguraduhing malaman kung bakit mo binabago ang mga default. Sabi nga, narito ang isang halimbawa ng paggamit ng Camellia-256 (ibig sabihin, "CAMELLIA-256-CFB1") encryption na may "SHA3-512" digest. Palitan ang code sa "encrypt.gliim" ng:
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
Gumawa ng aplikasyon:
gg -q
Patakbuhin ito:
gg -r --req="/encrypt" --silent-header --exec
Sa kasong ito, ang resulta ay:
f4d64d920756f7220516567727cef2c47443973de03449915d50a1d2e5e8558e7e06914532a0b0bf13842f67f0a268c98da6 This contains a secret code, which is Open Sesame!
Muli, makukuha mo ang orihinal na data. Tandaan, kailangan mong gumamit ng parehong cipher at digest sa parehong encrypt-data at decrypt-data!
Siyempre, maaari mong gawin ang binary na naka-encrypt na halaga tulad ng dati sa pamamagitan ng paggamit ng "binary" at "output-length" na mga sugnay.
Kung mayroon kang mga panlabas na system na nag-e-encrypt ng data, at alam mo kung aling cipher at digest ang ginagamit nila, maaari mong itugma ang mga iyon at gawing interoperable ang iyong code. Gliimly ay gumagamit ng karaniwang OpenSSL library kaya malamang na ang ibang software ay maaari din.
Upang magdagdag ng asin sa pag-encrypt, gamitin ang sugnay na "asin". Maaari kang bumuo ng random na asin sa pamamagitan ng paggamit ng random-string statement (o random-crypto kung may pangangailangan). Narito ang code para sa "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
Gumawa ng aplikasyon:
gg -q
Patakbuhin ito ng ilang beses:
gg -r --req="/encrypt" --silent-header --exec gg -r --req="/encrypt" --silent-header --exec gg -r --req="/encrypt" --silent-header --exec
Ang resulta:
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!
Tulad ng nakikita mo, ang isang random na halaga ng asin (16 bytes ang haba sa kasong ito) ay nabuo para sa bawat pag-encrypt, at ang naka-encrypt na halaga ay naiiba sa bawat oras, kahit na ang data na naka-encrypt ay pareho! Ginagawa nitong mahirap na i-crack ang pag-encrypt na tulad nito.
Siyempre, upang i-decrypt, dapat mong i-record ang asin at gamitin ito nang eksakto tulad ng ginawa mo noong nag-encrypt. Sa code dito, ang variable na "rs" ay nagtataglay ng asin. Kung iimbak mo ang mga naka-encrypt na halaga sa database, malamang na iimbak mo ang asin sa tabi mismo nito.
Sa pagsasagawa, hindi ka gagamit ng ibang halaga ng asin para sa bawat mensahe. Lumilikha ito ng bagong susi sa bawat oras, at maaari nitong bawasan ang pagganap. At talagang hindi na kailangan para dito: ang paggamit ng asin ay upang gawing mas mahirap hulaan ang bawat susi (kahit ang mga pareho). Kapag nagawa mo na iyon, maaaring hindi mo na kailangang gawin itong muli, o madalas.
Sa halip, gagamit ka ng IV (Initialization Vector) para sa bawat mensahe. Ito ay karaniwang isang random na string na nagpapalabas sa parehong mga mensahe na naiiba at nagpapataas ng gastos sa pag-compute ng pag-crack ng password. Narito ang bagong code para sa "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
Gumawa ng aplikasyon:
gg -q
Patakbuhin ito ng ilang beses:
gg -r --req="/encrypt" --silent-header --exec gg -r --req="/encrypt" --silent-header --exec gg -r --req="/encrypt" --silent-header --exec
Ang resulta ay maaaring:
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
Maaari mong makita na ang parehong mensahe ay lumilitaw na iba kapag naka-encrypt, ngunit kapag na-decrypt, ito ay muling pareho. Siyempre, ang password, asin, bilang ng mga pag-ulit, at init-vector ay dapat na pareho para sa parehong pag-encrypt at pag-decryption.
Tandaan ang paggamit ng sugnay na "cache" sa encrypt-data at decrypt-data. Epektibo nitong ini-cache ang na-compute na key (ibinigay na password, asin, cipher/digest algorithm, at ang bilang ng mga pag-ulit), kaya hindi ito na-compute sa bawat oras sa pamamagitan ng loop. Gamit ang "cache," ang susi ay kinukuwenta nang isang beses, at pagkatapos ay ginagamit ang ibang IV (sa "init-vector" clause) para sa bawat mensahe.
Kung gusto mong paminsan-minsang muling buuin ang susi, gamitin ang sugnay na "clear-cache", na nagbibigay ng boolean. Kung totoo, ang susi ay muling kinukuwenta, kung hindi, ito ay naiwan. Tingnan ang encrypt-data para sa higit pa tungkol dito.
Natutunan mo kung paano i-encrypt at i-decrypt ang data gamit ang iba't ibang mga cipher, digest, asin, at IV value sa Gliimly. Maaari ka ring gumawa ng nababasa ng tao na naka-encrypt na halaga at isang binary na output, pati na rin ang pag-encrypt ng parehong mga string at binary na halaga (tulad ng mga dokumento).