Шифрлау – деректерді шифрды шешу арқылы ғана пайдалы етуге болатын жарамсыз пішінге айналдыру әдісі. Мақсаты - деректерді шифрын шеше алатын адамдарға ғана қолжетімді ету (яғни, оны пайдалануға жарамды ету). Әдетте рұқсат етілмеген қол жеткізу жағдайында деректерді алу мүмкін еместігіне көз жеткізу үшін деректерді шифрлау қажет. Бұл шабуылдаушы авторизация жүйелерін және қол жеткізуді басқаруды бұзып үлгергеннен кейінгі қорғаныстың соңғы желісі.
Бұл барлық деректерді шифрлау керек дегенді білдірмейді, себебі жиі авторизациялау және кіру жүйелері жеткілікті болуы мүмкін, сонымен қатар деректерді шифрлау және шифрды шешу үшін өнімділік айыппұлы бар. Деректер шифрланған жағдайда қолданбаны жоспарлау және тәуекелді бағалау мәселесі болса, кейде бұл HIPAA немесе GDPR сияқты реттеуші талап болып табылады.
Деректерді дискідегі сияқты немесе транзит кезінде, мысалы, Интернет арқылы байланысатын екі тарап арасында шифрлауға болады.
Мұнда сіз симметриялы шифрлау деп те белгілі құпия сөзді пайдаланып деректерді шифрлау және шифрын ашу жолын үйренесіз. Бұл құпия сөз ақпарат алмасып жатқан екі тарапқа да белгілі болуы керек.
Шифрлауды дұрыс және қауіпсіз пайдалану үшін түсіндіруді қажет ететін бірнеше түсініктер бар.
Шифр – шифрлау үшін қолданылатын алгоритм. Мысалы, AES256 - шифр. Шифрлау идеясы - бұл шифрлауға қатысты адамдардың көпшілігі ойлайтын нәрсе.
Дайджест - бұл шифр пайдаланбас бұрын құпия сөзді (яғни, шифрлау кілтін) шифрлау және ұзарту үшін пайдаланылатын хэш функциясы. Бұл не үшін жасалды? Біріншіден, ол шифрлау үшін жақсырақ жұмыс істейтін кілттің жақсы кездейсоқ, біркелкі ұзындықтағы хэшін жасайды. Ол сондай-ақ «тұздауға» өте қолайлы, бұл туралы келесі әңгіме.
«Тұз» - «кемпірқосақ» деп аталатын кестелерді жеңу әдісі. Шабуылдаушы екі хэштелген мәндер түпнұсқа болса, бұрынғысынша бірдей болатынын біледі. Дегенмен, хэшингке тұз мәнін қоссаңыз, олар қосылмайды. Ол «тұз» деп аталады, өйткені ол басқа нәрсе шығару үшін кілтпен араласады.
Енді кемпірқосақ кестесі құпия сөзді табу үшін белгілі хэштелген мәндерді алдын ала есептелген деректермен сәйкестендіруге тырысады.
Әдетте, тұз әр кілт үшін кездейсоқ түрде жасалады және онымен бірге сақталады. Белгілі хэштерді сәйкестендіру үшін шабуылдаушыға көптеген кездейсоқ мәндер үшін кемпірқосақ кестелерін алдын ала есептеу керек болады, бұл әдетте мүмкін емес.
Шифрлаудағы «итерациялар» туралы жиі естисіз. Итерация - кілт пен тұзды табу қиынырақ болатындай араласатын бір цикл. Бұл шабуылдаушыға кілтті, демек, «итерацияларды» (көпше түрде) кері болжауды есептеу қиынға соғу үшін бірнеше рет жасалады. Әдетте, итерациялардың ең аз талап етілетін саны 1000 құрайды, бірақ ол одан басқаша болуы мүмкін. Егер сіз шынымен күшті құпия сөзден бастасаңыз, сізге азырақ қажет.
IV (немесе «Инициализация векторы») әдетте әрбір хабарламаны шифрлау үшін пайдаланылатын кездейсоқ мән болып табылады. Енді тұз құпия сөзге негізделген кілт жасау үшін қолданылады. Ал IV кілті бұрыннан бар және қазір хабарларды шифрлау кезінде пайдаланылады. IV мақсаты - шифрланған кезде бірдей хабарларды басқаша көрсету. Кейде IV-де дәйекті құрамдас болады, сондықтан ол кездейсоқ жолдан және үнемі артып отыратын тізбектен тұрады.
Бұл «қайталау» шабуылдарын қиындатады, бұл жерде шабуылдаушы хабарламаның шифрын ашуды қажет етпейді; керісінше, шифрланған хабарлама «иіске алынды» (яғни, жіберуші мен қабылдаушы арасында ұсталды), содан кейін орындалған әрекетті қайталауға үміттеніп, қайта ойнатылды. Шындығында, жоғары деңгейлі хаттамалардың көпшілігінде реттілік бар, мұнда әрбір хабарлама оның бір бөлігі ретінде ұлғайған пакеттік нөмірге ие, сондықтан көп жағдайда IV үшін оны қажет етпейді.
Бұл мысалда Gliimly құрылымы қолданылады. Алдымен оны орнатыңыз .
Мұнда мысалдарды іске қосу үшін жеке каталогта "enc" қолданбасын жасаңыз (толығырақ Gliimly бағдарламасының менеджері туралы mgrg бөлімін қараңыз):
mkdir enc_example cd enc_example gg -k enc
Деректерді шифрлау үшін encrypt-data мәлімдемесін пайдаланыңыз. Ең қарапайым пішін нөлмен аяқталатын жолды шифрлау болып табылады. "encrypt.gliim" файлын жасаңыз және мынаны көшіріңіз:
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
Сіз шифрлау-деректер мен шифрды-деректерді негізгі пайдалануды көре аласыз. Сіз деректерді (түпнұсқа немесе шифрланған) және құпия сөзді бересіз және кетесіз. Деректер шифрланады, содан кейін түпнұсқаны береді.
Бастапқы кодта «enc_str» жолының айнымалысы («char *» ретінде жасалған) «Бұл құпия кодты қамтиды, ол Open Sesame!» шифрланған нұсқасын қамтиды. және "dec_str" шифры шешілген деректер болады, олар дәл солай болуы керек.
Бұл кодты пәрмен жолынан іске қосу үшін алдымен қолданбаны жасаңыз:
gg -q
Содан кейін Gliimly оны іске қосу үшін bash кодын шығарыңыз - сұрау жолы "/encrypt" болып табылады, ол біздің жағдайда "encrypt.gliim" бастапқы файлында анықталған "void encrypt()" функциясы арқылы өңделеді. Gliimly тілінде бұл атаулар әрқашан сәйкес келеді, бұл кодты жазуды, оқуды және орындауды жеңілдетеді. Сұрау жолын көрсету және бағдарламаны іске қосу үшін қажет кодты алу үшін gg ішіндегі «-r» опциясын пайдаланыңыз:
gg -r --req="/encrypt" --silent-header --exec
Сіз келесідей жауап аласыз:
72ddd44c10e9693be6ac77caabc64e05f809290a109df7cfc57400948cb888cd23c7e98e15bcf21b25ab1337ddc6d02094232111aa20a2d548c08f230b6d56e9 This contains a secret code, which is Open Sesame!
Мұнда сізде шифрланған деректер бар, содан кейін бұл шифрланған деректер сол құпия сөз арқылы шифрдан шығарылады. Таңқаларлық емес, нәтиже бірінші кезекте шифрлаған жолға сәйкес келеді.
Әдепкі бойынша, шифрлау деректері адам оқи алатын он алтылық пішінде шифрланған мәнді жасайтынын ескеріңіз, бұл "0" - "9" және "a" - "f" он алтылық таңбаларынан тұратынын білдіреді. Осылайша, шифрланған деректерді кәдімгі жолға сақтауға болады. Мысалы, ол JSON құжатына, дерекқордағы VARCHAR бағанына немесе кез келген басқа жерге өтуі мүмкін. Дегенмен, сіз екілік шифрланған деректерді де жасай аласыз. Бұл туралы біраз уақыттан кейін.
Алдыңғы мысалда алынған шифрланған деректер адам оқи алатын он алтылық пішінде болады. Сондай-ақ, екілік шифрланған деректерді жасауға болады, ол адам оқи алатын жол емес және қысқарақ. Ол үшін «екілік» сөйлемді пайдаланыңыз. "encrypt.gliim" ішіндегі кодты келесімен ауыстырыңыз:
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
Екілік шифрланған деректерді алғыңыз келгенде, оның ұзындығын да байтпен алуыңыз керек, әйтпесе оның қайда аяқталатынын білмейсіз, өйткені онда нөлдік байттар болуы мүмкін. Осы мақсат үшін «шығыс ұзындығы» тармағын пайдаланыңыз. Бұл кодта "enc_str" айнымалысындағы шифрланған деректер "encrypted_data" файлына жазылады, ал жазылған ұзындық "outlen" байт болып табылады.
Файл жолсыз жазылғанда, ол әрқашан қолданбаның негізгі каталогында жазылады ( каталогтарды қараңыз), сондықтан сол каталогты алу үшін get-app қолданбасын пайдаланасыз.
Деректердің шифрын шешкен кезде, «енгізу-ұзындығы» тармағының қолданылуына назар аударыңыз. Ол шифрланған деректерде қанша байт бар екенін көрсетеді. Әлбетте, сіз оны «outlen» айнымалысынан ала аласыз, мұнда шифрланған деректер шифрланған деректердің ұзындығын сақтайды. Шифрлау және шифрды шешу ажыратылғанда, яғни бөлек бағдарламаларда іске қосылғанда, сіз бұл ұзындықтың қолжетімді болуын қамтамасыз етесіз.
Сондай-ақ, деректер «екілік» ретінде шифрланған кезде (екілік шығысты жасау дегенді білдіреді) шифрды шешуде де солай қолданылуы керек екенін ескеріңіз.
Өтінім жасаңыз:
gg -q
Оны бұрынғыдай іске қосыңыз:
gg -r --req="/encrypt" --silent-header --exec
Нәтиже:
Encrypted data written to file /var/lib/gg/enc/app/encrypted_data This contains a secret code, which is Open Sesame!
Шифры шешілген деректер түпнұсқамен бірдей.
Файлға жазылған нақты шифрланған деректерді Linux утилитасын «сегіздік дамп» («od») пайдалану арқылы көре аласыз:
od -c /var/lib/gg/enc/app/encrypted_data
сияқты нәтижемен:
$ 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
Міне, сізде бар. Сіз деректердің екілік екенін байқайсыз және оның құрамында нөлдік байт(лар) бар.
Бұл мысалдардағы шифрланатын деректер жол болып табылады, яғни нөлмен бөлінген. Екілік деректерді толық көрсету арқылы оңай шифрлай аласыз (Глиимли қанша байт бар екенін қадағалайды!) немесе оның ұзындығын "енгізу-ұзындығы" тармағында көрсету арқылы, мысалы, оны "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
Бұл кез келген нөлдік байтқа қарамастан "enc_str" жад орнында 12 байтты шифрлайды. Бұл жағдайда, бұл "Осы c", одан кейін нөлдік байт, одан кейін "ontain" жолы, бірақ ол екілік деректердің кез келген түрі болуы мүмкін, мысалы, JPG файлының мазмұны.
Шифрды шешу жағында сіз «шығыс ұзындығы» тармағында шифры шешілген байттардың санын аласыз. Соңында, шифры шешілген деректер түпнұсқа болып табылады және нөлдік байт әдеттегі сегіздік көріністе көрсетіледі.
Өтінім жасаңыз:
gg -q
Оны бұрынғыдай іске қосыңыз:
gg -r --req="/encrypt" --silent-header --exec
Нәтиже:
6bea45c2f901c0913c87fccb9b347d0a This c\000ontai
Шифрланған мән қысқарақ, себебі бұл жағдайда да деректер қысқа болады және нәтиже түпнұсқаға дәл сәйкес келеді.
Әдепкі бойынша қолданылатын шифрлау стандартты OpenSSL кітапханасынан AES256 және SHA256 хэштеу болып табылады, олардың екеуі де криптографияда кеңінен қолданылады. Дегенмен сіз OpenSSL қолдайтын кез келген қолжетімді шифр мен дайджестті (яғни хэшті) пайдалана аласыз (тіпті сіз ұсынатын пайдаланушылар).
Қандай алгоритмдердің қолжетімді екенін көру үшін пәрмен жолында мұны орындаңыз:
#get list of cipher providers openssl list -cipher-algorithms #get list of digest providers openssl list -digest-algorithms
Бұл екеуі шифр және дайджест (хэш) алгоритмдерінің тізімін береді. Олардың кейбіреулері Gliimly таңдаған әдепкіден әлсіз болуы мүмкін, ал басқалары ескі жүйелермен кері үйлесімділік үшін ғана болуы мүмкін. Дегенмен, басқалары мүлдем жаңа болуы мүмкін және сіз олардың болуын қалағандай дәрежеде растауға уақыттары жеткіліксіз болуы мүмкін.
Сондықтан, осы алгоритмдерді таңдағанда абай болыңыз және әдепкілерді неге өзгертіп жатқаныңызды біліңіз. Бұл жерде Camellia-256 (яғни, «CAMELLIA-256-CFB1») шифрлауын «SHA3-512» дайджестімен пайдаланудың мысалы келтірілген. "encrypt.gliim" ішіндегі кодты келесімен ауыстырыңыз:
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
Өтінімді жасаңыз:
gg -q
Оны іске қосыңыз:
gg -r --req="/encrypt" --silent-header --exec
Бұл жағдайда нәтиже:
f4d64d920756f7220516567727cef2c47443973de03449915d50a1d2e5e8558e7e06914532a0b0bf13842f67f0a268c98da6 This contains a secret code, which is Open Sesame!
Тағы да, сіз бастапқы деректерді аласыз. Назар аударыңыз, сіз шифрлау-деректер мен шифрды-деректердің екеуінде де бірдей шифр мен дайджестті пайдалануыңыз керек!
Сіз, әрине, "екілік" және "шығыс ұзындығы" тармақтарын пайдалану арқылы бұрынғыдай екілік шифрланған мәнді жасай аласыз.
Егер сізде деректерді шифрлайтын сыртқы жүйелер болса және олар қандай шифр мен дайджестті пайдаланатынын білсеңіз, оларды сәйкестендіріп, кодыңызды өзара әрекеттесу мүмкіндігіне ие ете аласыз. Gliimly стандартты OpenSSL кітапханасын пайдаланады, сондықтан басқа бағдарламалық жасақтама да болуы мүмкін.
Шифрлауға тұз қосу үшін «тұз» тармағын пайдаланыңыз. Кездейсоқ жол мәлімдемесін (немесе қажет болған жағдайда кездейсоқ крипто ) пайдалану арқылы кездейсоқ тұзды жасауға болады. Міне "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
Өтінімді жасаңыз:
gg -q
Оны бірнеше рет іске қосыңыз:
gg -r --req="/encrypt" --silent-header --exec gg -r --req="/encrypt" --silent-header --exec gg -r --req="/encrypt" --silent-header --exec
Нәтиже:
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!
Көріп отырғаныңыздай, әрбір шифрлау үшін кездейсоқ тұз мәні (бұл жағдайда ұзындығы 16 байт) жасалады және шифрланатын деректер бірдей болса да, шифрланған мән әр уақытта әртүрлі болады! Бұл шифрлауды бұзуды қиындатады.
Әрине, шифрды шешу үшін тұзды жазып алып, оны шифрлау кезіндегідей пайдалану керек. Мұндағы кодта «rs» айнымалысы тұзды ұстайды. Шифрланған мәндерді дерекқорда сақтасаңыз, тұзды оның жанында сақтауыңыз мүмкін.
Іс жүзінде әрбір хабарлама үшін басқа тұз мәнін қолданбайсыз. Ол әр уақытта жаңа кілт жасайды және бұл өнімділікті төмендетуі мүмкін. Және бұл шынымен де қажет емес: тұзды пайдалану әрбір кілтті (тіпті бірдей) табуды қиындатады. Мұны істегеннен кейін оны қайталау немесе жиі жасау қажет болмауы мүмкін.
Оның орнына сіз әрбір хабарлама үшін IV (Инициализация векторы) қолданасыз. Бұл әдетте бірдей хабарларды әртүрлі етіп көрсететін және құпия сөзді бұзудың есептеу құнын арттыратын кездейсоқ жол. Міне, "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
Өтінімді жасаңыз:
gg -q
Оны бірнеше рет іске қосыңыз:
gg -r --req="/encrypt" --silent-header --exec gg -r --req="/encrypt" --silent-header --exec gg -r --req="/encrypt" --silent-header --exec
Нәтиже болуы мүмкін:
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
Бір хабар шифрланған кезде басқаша көрінетінін көре аласыз, бірақ шифры шешілгенде, ол қайтадан бірдей. Әрине, пароль, тұз, итерация саны және init-вектор шифрлау үшін де, шифрды шешу үшін де бірдей болуы керек.
«Кэш» тармағын шифрлау-деректер мен шифрды-деректерді пайдалануды ескеріңіз. Ол есептелген кілтті тиімді кэштейді (берілген құпия сөз, тұз, шифр/дайджест алгоритмдері және итерациялар саны), сондықтан ол цикл арқылы әр уақытта есептелмейді. «Кэш» көмегімен кілт бір рет есептеледі, содан кейін әр хабарлама үшін басқа IV («init-vektor» тармағында) пайдаланылады.
Кілтті мезгіл-мезгіл қайта құрғыңыз келсе, логикалық мәнді беретін «кэшті тазалау» тармағын пайдаланыңыз. Егер шын болса, кілт қайта есептеледі, әйтпесе ол жалғыз қалады. Бұл туралы қосымша ақпаратты шифрлау деректерін қараңыз.
Сіз Gliimly бағдарламасында әртүрлі шифрларды, дайджесттерді, тұзды және IV мәндерді пайдаланып деректерді шифрлауды және шифрын ашуды үйрендіңіз. Сондай-ақ адам оқи алатын шифрланған мәнді және екілік шығысты жасауға, сондай-ақ жолдарды және екілік мәндерді (құжаттар сияқты) шифрлауға болады.