Usimbaji fiche ni njia ya kugeuza data kuwa fomu isiyoweza kutumika ambayo inaweza kutumika tu kwa njia ya usimbuaji. Kusudi ni kufanya data ipatikane kwa wale tu wanaoweza kusimbua (yaani, kuifanya iweze kutumika). Kwa kawaida, data inahitaji kusimbwa kwa njia fiche ili kuhakikisha kuwa haiwezi kupatikana katika kesi ya ufikiaji ambao haujaidhinishwa. Ni safu ya mwisho ya ulinzi baada ya mshambuliaji kufaulu kuvunja mifumo ya uidhinishaji na udhibiti wa ufikiaji.
Hii haimaanishi kwamba data yote inahitaji kusimbwa kwa njia fiche, kwa sababu mara nyingi, mifumo ya uidhinishaji na ufikiaji inaweza kutosha, na kwa kuongeza, kuna adhabu ya utendaji kwa kusimba na kusimbua data. Ikiwa na wakati data inasimbwa kwa njia fiche ni suala la kupanga programu na tathmini ya hatari, na wakati mwingine, pia ni hitaji la udhibiti, kama vile HIPAA au GDPR.
Data inaweza kusimbwa kwa njia fiche wakati wa kupumzika, kama vile kwenye diski, au katika usafiri, kama vile kati ya pande mbili zinazowasiliana kupitia Mtandao.
Hapa, utajifunza jinsi ya kusimba na kusimbua data kwa kutumia nenosiri, linalojulikana pia kama usimbaji linganifu. Nenosiri hili lazima lijulikane kwa pande zote mbili zinazobadilishana habari.
Ili kutumia usimbaji fiche ipasavyo na kwa usalama, kuna dhana chache zinazohitaji kuelezwa.
Cipher ni algoriti inayotumika kwa usimbaji fiche. Kwa mfano, AES256 ni cipher. Wazo la cipher ndilo ambalo watu wengi watafikiria linapokuja suala la usimbaji fiche.
Muhtasari kimsingi ni chaguo la kukokotoa la heshi ambalo hutumika kuchambua na kurefusha nenosiri (yaani, ufunguo wa usimbaji fiche) kabla ya kutumiwa na msimbo. Kwa nini hili linafanywa? Kwa moja, huunda ufunguo usio na mpangilio mzuri, wa urefu sawa ambao hufanya kazi vyema kwa usimbaji fiche. Pia ni mzuri sana kwa "salting", ambayo ni ya pili ya kuzungumza juu.
"Chumvi" ni njia ya kushinda meza zinazoitwa "upinde wa mvua". Mshambulizi anajua kwamba thamani mbili za heshi bado zitafanana kabisa ikiwa nakala asili zingekuwa. Walakini, ikiwa unaongeza thamani ya chumvi kwa hashing, basi hawatafanya hivyo. Inaitwa "chumvi" kwa sababu ni aina ya mchanganyiko na ufunguo wa kuzalisha kitu tofauti.
Sasa, jedwali la upinde wa mvua litajaribu kulinganisha thamani za heshi zinazojulikana na data iliyokusanywa mapema katika jitihada za kukisia nenosiri.
Kawaida, chumvi hutolewa kwa nasibu kwa kila ufunguo na kuhifadhiwa nayo. Ili kulinganisha heshi zinazojulikana, mshambuliaji atalazimika kuhesabu mapema jedwali la upinde wa mvua kwa thamani nyingi sana nasibu, jambo ambalo kwa ujumla haliwezekani.
Mara nyingi utasikia kuhusu "marudio" katika usimbaji fiche. Kurudia ni mzunguko mmoja ambapo ufunguo na chumvi huchanganywa kwa njia ya kufanya kubahatisha ufunguo kuwa ngumu zaidi. Hii inafanywa mara nyingi ili kuifanya iwe ngumu kwa hesabu kwa mshambuliaji kugeuza-kisia ufunguo, kwa hivyo "marudio" (wingi). Kwa kawaida, idadi ya chini inayohitajika ya marudio ni 1000, lakini inaweza kuwa tofauti na hiyo. Ukianza na nenosiri kali sana, kwa ujumla unahitaji kidogo.
IV (au "Vekta ya Kuanzisha") kwa kawaida ni thamani ya nasibu ambayo hutumiwa kwa usimbaji fiche wa kila ujumbe. Sasa, chumvi hutumiwa kutengeneza ufunguo kulingana na nenosiri. Na IV inatumika wakati tayari una ufunguo na sasa unasimba ujumbe. Madhumuni ya IV ni kufanya ujumbe sawa kuonekana tofauti wakati umesimbwa. Wakati mwingine, IV pia ina sehemu ya mfuatano, kwa hivyo imeundwa na mfuatano wa nasibu pamoja na mfuatano ambao huongezeka kila mara.
Hii hufanya mashambulizi ya "kucheza tena" kuwa magumu, ambapo mshambuliaji hahitaji kusimbua ujumbe; badala yake, ujumbe uliosimbwa "ulinuswa" (yaani, kukatwa kati ya mtumaji na mpokeaji) na kisha kuchezwa tena, kutarajia kurudia kitendo ambacho tayari kimetekelezwa. Ingawa katika hali halisi, itifaki nyingi za kiwango cha juu tayari zina mfuatano mahali, ambapo kila ujumbe una, kama sehemu yake, nambari ya pakiti inayoongezeka, kwa hivyo katika hali nyingi IV haihitaji.
Mfano huu unatumia mfumo wa Gliimly . Isakinishe kwanza.
Ili kuendesha mifano hapa, tengeneza programu "enc" katika saraka yake mwenyewe (tazama mgrg kwa zaidi juu ya msimamizi wa programu wa Gliimly):
mkdir enc_example cd enc_example gg -k enc
Ili kusimba data kwa njia fiche tumia taarifa ya usimbaji-data . Njia rahisi zaidi ni kusimba mfuatano uliobatilishwa kwa njia fiche. Unda faili "encrypt.gliim" na unakili hii:
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
Unaweza kuona matumizi ya msingi ya encrypt-data na decrypt-data . Unatoa data (ya awali au iliyosimbwa) na nenosiri, na unaenda. Data imesimbwa kwa njia fiche na kisha kufutwa, ikitoa ya asili.
Katika msimbo wa chanzo, tofauti ya mfuatano "enc_str" (ambayo imeundwa kama "char *") itakuwa na toleo lililosimbwa la "Hili lina msimbo wa siri, ambao ni Open Sesame!" na "dec_str" itakuwa data iliyosimbwa ambayo lazima iwe sawa kabisa.
Ili kuendesha nambari hii kutoka kwa safu ya amri, fanya programu kwanza:
gg -q
Kisha Gliimly itoe msimbo wa bash ili kuiendesha - njia ya ombi ni "/encrypt", ambayo, kwa upande wetu, inashughulikiwa na kazi "void encrypt()" iliyofafanuliwa kwenye faili ya chanzo "encrypt.gliim". Katika Gliimly, majina haya yanalingana kila wakati, na kuifanya iwe rahisi kuandika, kusoma na kutekeleza msimbo. Tumia chaguo la "-r" katika gg kutaja njia ya ombi na upate nambari unayohitaji ili kuendesha programu:
gg -r --req="/encrypt" --silent-header --exec
Utapata jibu kama hili:
72ddd44c10e9693be6ac77caabc64e05f809290a109df7cfc57400948cb888cd23c7e98e15bcf21b25ab1337ddc6d02094232111aa20a2d548c08f230b6d56e9 This contains a secret code, which is Open Sesame!
Ulicho nacho hapa ni data iliyosimbwa, na kisha data hii iliyosimbwa inasimbwa kwa kutumia nenosiri sawa. Haishangazi, matokeo yanalingana na mfuatano uliosimbwa kwa njia fiche hapo kwanza.
Kumbuka kuwa kwa chaguo-msingi, data ya usimbaji fiche itatoa thamani iliyosimbwa kwa njia fiche inayoweza kusomeka na binadamu, ambayo ina maana inayojumuisha herufi za heksadesimali "0" hadi "9" na "a" hadi "f". Kwa njia hii, unaweza kuhifadhi data iliyosimbwa kwa mfuatano wa kawaida. Kwa mfano, inaweza kwenda kwa hati ya JSON, kwenye safu wima ya VARCHAR kwenye hifadhidata, au mahali pengine popote. Walakini, unaweza pia kutoa data iliyosimbwa kwa binary. Zaidi juu ya hilo kidogo.
Katika mfano uliopita, data iliyosimbwa inayotokana iko katika umbo la heksadesimali linaloweza kusomeka na binadamu. Unaweza pia kuunda data iliyosimbwa kwa njia ya binary, ambayo si kamba inayoweza kusomeka na binadamu na pia ni fupi zaidi. Ili kufanya hivyo, tumia kifungu cha "binary". Badilisha msimbo katika "encrypt.gliim" na:
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
Unapotaka kupata data iliyosimbwa kwa njia ya binary, unapaswa kupata urefu wake kwa baiti pia, au la sivyo, hutajua inaishia wapi, kwani inaweza kuwa na ka baiti ndani yake. Tumia kifungu cha "output-length" kwa kusudi hilo. Katika msimbo huu, data iliyosimbwa kwa kutofautisha "enc_str" imeandikwa ili faili "encrypted_data", na urefu ulioandikwa ni "outlen" byte.
Faili inapoandikwa bila njia, huandikwa kila mara kwenye saraka ya nyumbani ya programu (tazama saraka ), kwa hivyo ungetumia get-app kupata saraka hiyo.
Wakati wa kusimbua data, tambua matumizi ya kifungu cha "urefu wa ingizo". Inasema data iliyosimbwa ina byte ngapi. Ni wazi, unaweza kupata hiyo kutoka kwa utofauti wa "outlen", ambapo data ya usimbaji fiche huhifadhi urefu wa data iliyosimbwa. Wakati usimbaji fiche na usimbuaji hutenganishwa, yaani, kuendesha katika programu tofauti, unahakikisha urefu huu unapatikana.
Ona pia kwamba wakati data imesimbwa kwa njia fiche kama "binary" (ikimaanisha kutoa matokeo ya mfumo wa jozi), usimbaji fiche lazima utumie vivyo hivyo.
Fanya maombi:
gg -q
Iendeshe sawa na hapo awali:
gg -r --req="/encrypt" --silent-header --exec
Matokeo yake ni:
Encrypted data written to file /var/lib/gg/enc/app/encrypted_data This contains a secret code, which is Open Sesame!
Data iliyosimbwa ni sawa kabisa na ya asili.
Unaweza kuona data halisi iliyosimbwa iliyoandikwa kwa faili kwa kutumia matumizi ya Linux ya "octal dump" ("od"):
od -c /var/lib/gg/enc/app/encrypted_data
na matokeo kama:
$ 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
Hapo unayo. Utagundua data ni ya binary, na kwa kweli ina null byte(s).
Data ya kusimba kwa njia fiche katika mifano hii ni mfuatano, yaani, isiyotenganishwa. Unaweza kusimba data ya jozi kwa njia fiche kwa urahisi kwa kuibainisha nzima (kwa kuwa Gliimly hufuatilia idadi ya baiti zilizopo!) au kubainisha urefu wake katika kifungu cha "urefu wa ingizo", kwa mfano, nakili hii kwa "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
Hii itasimba kwa njia fiche baiti 12 kwenye eneo la kumbukumbu "enc_str" bila kujali baiti tupu. Katika kesi hii, hiyo ni "Hii c" ikifuatiwa na null byte ikifuatiwa na kamba ya "ontain", lakini inaweza kuwa aina yoyote ya data ya binary, kwa mfano, yaliyomo kwenye faili ya JPG.
Kwenye upande wa kusimbua, utapata idadi ya baiti zilizosimbwa katika kifungu cha "urefu wa matokeo". Hatimaye, data iliyosimbwa inaonyeshwa kuwa halisi kabisa, na null byte inawasilishwa katika uwakilishi wa kawaida wa oktali.
Fanya maombi:
gg -q
Iendeshe sawa na hapo awali:
gg -r --req="/encrypt" --silent-header --exec
Matokeo yake ni:
6bea45c2f901c0913c87fccb9b347d0a This c\000ontai
Thamani iliyosimbwa kwa njia fiche ni fupi kwa sababu data ni fupi katika kesi hii pia, na matokeo yanalingana kabisa na asili.
Usimbaji fiche unaotumiwa na chaguo-msingi ni AES256 na SHA256 hashing kutoka kwa maktaba ya kawaida ya OpenSSL , ambayo yote hutumika sana katika usimbaji fiche. Hata hivyo unaweza kutumia cipher na digest yoyote inayopatikana (yaani, heshi) ambayo inatumika na OpenSSL (hata zile maalum unazotoa).
Ili kuona ni algorithms zipi zinapatikana, fanya hivi kwenye safu ya amri:
#get list of cipher providers openssl list -cipher-algorithms #get list of digest providers openssl list -digest-algorithms
Hizi mbili zitatoa orodha ya algoriti za cipher na digest (hash). Baadhi yao wanaweza kuwa dhaifu kuliko zile chaguo-msingi zilizochaguliwa na Gliimly, na zingine zinaweza kuwa hapo kwa ajili ya upatanifu wa nyuma na mifumo ya zamani. Walakini, wengine wanaweza kuwa wapya kabisa na hawakuwa na wakati wa kutosha wa kuthibitishwa kwa kiwango unachotaka wawe.
Kwa hivyo, kuwa mwangalifu wakati wa kuchagua algoriti hizi, na hakikisha kujua kwa nini unabadilisha zile chaguo-msingi. Hiyo ilisema, hapa kuna mfano wa kutumia usimbaji wa Camellia-256 (yaani, "CAMELLIA-256-CFB1") na muhtasari wa "SHA3-512". Badilisha msimbo katika "encrypt.gliim" na:
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
Fanya maombi:
gg -q
Iendesha:
gg -r --req="/encrypt" --silent-header --exec
Katika kesi hii, matokeo ni:
f4d64d920756f7220516567727cef2c47443973de03449915d50a1d2e5e8558e7e06914532a0b0bf13842f67f0a268c98da6 This contains a secret code, which is Open Sesame!
Tena, unapata data asili. Kumbuka, lazima utumie misimbo sawa na kuchimbua katika data ya usimbaji fiche na data ya kusimbua!
Bila shaka unaweza kutoa thamani iliyosimbwa kwa njia ya binary kama hapo awali kwa kutumia vifungu vya "binary" na "output-length".
Iwapo una mifumo ya nje inayosimba data kwa njia fiche, na unajua ni cipher na muhtasari gani wanayotumia, unaweza kulinganisha hizo na kufanya msimbo wako ushirikiane. Gliimly hutumia maktaba ya kawaida ya OpenSSL kwa hivyo kuna uwezekano kwamba programu zingine pia.
Ili kuongeza chumvi kwenye usimbuaji, tumia kifungu cha "chumvi". Unaweza kutoa chumvi nasibu kwa kutumia taarifa ya kamba bila mpangilio (au nasibu-crypto ikiwa kuna hitaji). Huu hapa ni msimbo wa "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
Fanya maombi:
gg -q
Iendesha mara chache:
gg -r --req="/encrypt" --silent-header --exec gg -r --req="/encrypt" --silent-header --exec gg -r --req="/encrypt" --silent-header --exec
Matokeo:
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!
Kama unavyoona, thamani ya chumvi nasibu (urefu wa baiti 16 katika kesi hii) inatolewa kwa kila usimbaji fiche, na thamani iliyosimbwa ni tofauti kila wakati, ingawa data iliyosimbwa ilikuwa sawa! Hii inafanya kuwa ngumu kupekua usimbaji fiche kama hii.
Kwa kweli, ili kusimbua, lazima urekodi chumvi na uitumie kama vile ulivyofanya wakati wa kusimba. Katika nambari hapa, kutofautisha "rs" kunashikilia chumvi. Ikiwa utahifadhi maadili yaliyosimbwa kwenye hifadhidata, unaweza kuhifadhi chumvi karibu nayo.
Kwa mazoezi, haungetumia thamani tofauti ya chumvi kwa kila ujumbe. Inaunda ufunguo mpya kila wakati, na hiyo inaweza kupunguza utendakazi. Na hakuna haja yake: utumiaji wa chumvi ni kufanya kila funguo (hata zile zile) kuwa ngumu zaidi kukisia. Ukishafanya hivyo, huenda usihitaji kuifanya tena, au mara nyingi.
Badala yake, ungetumia IV (Vekta ya Kuanzisha) kwa kila ujumbe. Kawaida ni mfuatano wa nasibu ambao hufanya ujumbe sawa kuonekana tofauti na huongeza gharama ya hesabu ya kuvunja nenosiri. Huu hapa ni msimbo mpya wa "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
Fanya maombi:
gg -q
Iendesha mara chache:
gg -r --req="/encrypt" --silent-header --exec gg -r --req="/encrypt" --silent-header --exec gg -r --req="/encrypt" --silent-header --exec
Matokeo yake yanaweza kuwa:
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
Unaweza kuona kwamba ujumbe huo huo unaonekana tofauti wakati umesimbwa, ingawa unaposimbwa, ni sawa tena. Bila shaka, nenosiri, chumvi, idadi ya marudio, na init-vector lazima iwe sawa kwa usimbaji fiche na usimbuaji.
Kumbuka matumizi ya kifungu cha "cache" katika usimbaji-data na usimbuaji-data. Inahifadhi kwa ufanisi ufunguo uliokokotwa (nenosiri uliyopewa, chumvi, algoriti za cipher/digest, na idadi ya marudio), kwa hivyo haijakokotwa kila wakati kupitia kitanzi. Na "cache," ufunguo unakokotolewa mara moja, na kisha IV tofauti (katika kifungu cha "init-vector") hutumiwa kwa kila ujumbe.
Ikiwa unataka kuunda tena ufunguo mara kwa mara, tumia kifungu cha "clear-cache", ambacho hutoa boolean. Ikiwa ndivyo, ufunguo huongezwa tena, vinginevyo, utaachwa peke yake. Tazama data ya usimbaji fiche kwa zaidi kuhusu hili.
Umejifunza jinsi ya kusimba na kusimbua data kwa kutumia misimbo tofauti, muhtasari, chumvi na thamani za IV katika Gliimly. Unaweza pia kuunda thamani iliyosimbwa kwa njia fiche inayoweza kusomeka na binadamu na towe la mfumo wa jozi, pamoja na kusimba mifuatano na maadili ya binary (kama hati).