Vol 3.0: Կրիպտոգրաֆիա։ Կոնցեպտներ, որ պետք է իմանա ցանկացած ծրագրավորող (HMAC, Symmetric/Asymmetric Encryption)

Kristine Armiyants
5 min readJun 5, 2022

--

Հիշում եք չէ՞ (եթե չեք հիշում, կա հավանականություն, որ նախորդ հոդվածները բաց եք թողել. էնտեղից սկսեք)՝ մենք կարող ենք էլ ավելի secure դարձնել data-ի պահպանումը DB-ում։

Սկսենք ծանոթությունը․ HMAC (hash-based message authentication code)։

Եթե պարզ ու կարճ խոսենք, այստեղ գաղափարն այն է, որ մենք ստեղծում ենք հեշ, որը կրկին ստեղծելու համար անհրաժեշտ է գաղտնաբառ կամ key (բանալի)։ Գործնականում կիրառվող օրինակներից մեկը JWT (JSON web token) է, որը կիրառվում է վեբում authentication-ի համար։

Դե ինչ, ավելացնենք hmac-ը մեր նախորդ օրինակներին։

  • Crypto- ից վերցնենք createHmac մեթոդը,
  • սահմանենք մեր secret key-ն և հաղորդագրությունը, որն ուզում ենք հեշավորել,
  • տպենք հեշավորված արժեքը տեսնելու համար
  • սահմանենք նոր secret key, որպեսզի տեսնենք, որ հեշավորված արժեքները տարբեր են

Voilà ! Ստացվեց !
Բայց ի՞ նչ կպատահի, երբ ուզենք կիսվել secret-ով արևէ մեկի հետ, որպեսզի նրանք էլ ունենան հնարավորություն օրիգինալ հաղորդագրությունը ընթերցելու։ Այստեղ հասնում ենք
ENCRYPTION / Կոդավորում — ին։

Կոդավորումը գաղտնագրության ձև է, որը «խառնում է» պարզ տեքստը անհասկանալի գաղտնագրված տեքստի` սովորաբար randomized / պատահականացված։ այսպիսով նույն տեքստը ամեն անգամ նույն բանալիով գաղտնագրելիս կստանանք լրիվ նոր «խառնուրդ» :

Տարբերում ենք կոդավորման երկու տեսակ.

  1. սիմետրիկ
  2. ասիմետրիկ

Սիմետրիկ գաղտնագրումը օգտագործում է ընդամենը մեկ բանալի, որը կոչվում է ընդհանուր գաղտնիք / shared secret, և՛ գաղտնագրման, և՛ ապակոդավորման համար:

Փորձե՞ նք node-ով գրել։

Դե բա էլ ինչի համար ենք հավաքվել. սկսենք։

Օգտագործել ենք crypto-ի հետևյալ մեթոդները.

  1. createCipheriv — ստեղծում և վերադարձնում է ծածկագիր օբյեկտ՝ տրված ալգորիթմով, բանալիով և initialization vector / սկզբնավորման վեկտորով(iv). վերջինը ապահովում է գաղտնագրման բլոկների պատահականությունն ու եզակիությունը:
  2. randomBytes — ստեղծում է ծածկագրային ուժեղ pseudorandom / «կեղծ պատահական» տվյալներ: Փոծանցվող արգումենտը մի թիվ է, որը ցույց է տալիս ստեղծվող բայթերի քանակը:
  3. createDecipheriv — օգտագործել ենք ապակոդավորման համար. ապակոդավորված օբյեկտը ստեղծվում է decipher.update() և decipher.final() մեթոդների միջոցով։

Ինչպես հեշը, ծածկագիրը նույնպես կախված է ալգորիթմից, թեև կոդավորման ալգորիթմները ի սկզբանե տարբեր են հեշավորման ալգորիթմներից։ AES-256 = Advanced Encryption Standard

Ելքը ՝

Սիմետրիկ գաղտնագրումը գաղտնագրման պարզ, հեշտ օգտագործվող մեթոդ է, բայց դրա հետ մեկ խնդիր կա. բանալին պետք է կիսվի ուղարկողի և ստացողի միջև, ուստի պետք է մշակվի բանալիների փոխանակման անվտանգ մեթոդ: Հակառակ դեպքում, եթե փոխանակման ժամանակ երրորդ կողմը գաղտնալսում է բանալին, չարտոնված անձը հեշտությամբ կարող է վերծանել տվյալները:

Եվ սա մեզ հասցնում է հաջորդ կանգառ ՝
Asymmetric Encryption / Ասիմետրիկ գաղտնագրում։

Ասիմետրիկ գաղտնագրումը հիմնված է բանալիների զույգի վրա: Երկու մաթեմատիկորեն փոխկապակցված բանալիներ, մեկը կոչվում է public / հանրային բանալի, մյուսը` private / մասնավոր բանալի, ստեղծվում են միասին օգտագործելու համար:

Private բանալին միշտ գաղտնի է պահվում և օգտագործվում է միայն սեփականատիրոջ կողմից։ Public բանալին հասանելի է բոլոր ցանկացողներին:

Համակարգչից պահանջվող ժամանակի և հզորության պատճառով ցանկացած մեկի համար «մաթեմատիկորեն անիրագործելի» է համարվում public բանալին օգտագործել private բանալին նորից ստեղծելու համար, ուստի գաղտնագրման այս ձևը համարվում է շատ անվտանգ:

Ասիմետրիկ գաղտնագրման հիմնական առավելությունն այն է, որ գաղտնի բանալի ապահով փոխանցման կարիք չկա: Փոխարենը, հանրային բանալին հրապարակվում է բաց, հասանելի է ամբողջ աշխարհին: Պետք չէ դա գաղտնի պահել, քանի որ այն միայնակ չի կարող օգտագործվել։ Գաղտնագրման գործընթացն աշխատում է այսպես.

  • Հաղորդագրություն ուղարկողն օգտագործում է ստացողի public բանալին, որն ազատորեն հասանելի է հաղորդագրությունը գաղտնագրելու համար:
  • Ստացողը վերծանում է հաղորդագրությունը՝ օգտագործելով իր private բանալին: Հաղորդագրությունը վերծանելու համար կարող է օգտագործվել միայն այն private բանալին, որը կապված է կոդավորման համար օգտագործված public բանալու հետ:

Այս բանալիների զույգը կարող է օգտագործվել նաև հաղորդագրություն ուղարկողի ինքնության նույնականացում ապահովելու համար՝ օգտագործելով բանալիները մի փոքր այլ կերպ. այս անգամ ուղարկողը օգտագործում է իր private բանալին՝ հաղորդագրությունը գաղտնագրելու համար: Այս համակարգը գաղտնիություն չի ապահովում, քանի որ յուրաքանչյուր ոք կարող է գաղտնազերծել հաղորդագրությունը՝ օգտագործելով սեփականատիրոջ public բանալին: Այնուամենայնիվ, այն հաստատում է ուղարկողի ինքնությունը։

Ակնհայտ է, որ բանալիների զույգով կրիպտոգրաֆիայի ամենակարևոր խնդիրը private բանալիների պաշտպանությունն է: Սա հատկապես կարևոր է, քանի որ private բանալին hack անելը ոչ միայն թույլ է տալիս չարտոնված անձին կարդալ սեփականատիրոջը ուղարկված անձնական հաղորդագրությունները, այլև «ստորագրել» գործարքներ՝ այդպիսով գողանալով սեփականատիրոջ ինքնությունը: Երբ բանալիների զույգն օգտագործվում է վարկային քարտի կամ բանկային անվտանգ գործարքների համար, այս բացը կարող է «թանկ» ու կորստաբեր լինել:

Լավ, լավ, հիմաաա :))

Օգտագործել ենք crypto-ի հետևյալ մեթոդները.

  1. generateKeyPairSync — sտեղծում է տրված տեսակի(մեր դեպքում ‘rsa’) նոր ասիմետրիկ բանալիների զույգ: «RSA» հապավումը գալիս է Ռոն Ռիվեստի, Ադի Շամիրի և Լեոնարդ Ադլեմանի ազգանուններից, ովքեր հրապարակայնորեն նկարագրել են ալգորիթմը 1977 թվականին։
  2. publicEncrypt — կոդավորում է բուֆերի բովանդակությունը public բանալիով և վերադարձնում է նոր բուֆեր՝ կոդավորված բովանդակությամբ: Վերադարձված տվյալները կարող են վերծանվել՝ օգտագործելով համապատասխան private բանալին։
  3. privateDecrypt — ապակոդավորում է բուֆերը մասնավոր բանալիով։

Ելքը՝

a5950a3f9a71891fc064b04523c5f0f814a78eb1ae2a33c5868e3fcb05689862f1bab3bcc6760229f905babac443d7f878d73cbab8437c81f7441bd5c5fd1dd121bb26a20bdad76538a2bdc567bd0ea71f2fc4b0924710fdea56a97356619adda1b942942fdb7d2d62d91b263996f693d71904d89bedb7a1da6b6c35801c71149bacdc26db0ec895deb2117b9c8694fa663e533507eaeef30f3019e08326967d6266c651ed8fb0f2c19cacebb0390bff1ef020a50c340c4447a784f65291b6580c6b6cecd528210945ed530e9cd9cd30c501b43d0c1261f01f9ac6c236437a76060d109a03abe53f37e0fbb544f79fd2c296f0f22a51dd383d249146f925964aհամարյա բան չմնաց, վերջացնում ենք

Բայց լուրջ, վերջացրինք :))

Հուսամ հավանեցիք և օգուտ քաղեցիք գաղտագրմանը վերաբերող այս շարքից։ Եթե կուզեք լինի շարունակություն այլ թեմաներով ու ունեք նախընտրածները, let me know մեկնաբանություններով, հոդվածը տարածելով, clap անելով (sharing is caring).

Take care and stay safe :)))

--

--

Kristine Armiyants

Software Engineer | AWS UG Armenia Lead ☁️ | AWS Community Builder