Բանալու գեներացումը ժամանակավոր ֆայլ չի պահանջում, և դրանից հրաժարվելը ուղղում է ավելի քիչ, քան ենթադրում են ուղեցույցների մեծ մասը։ Այն հեռացնում է ֆայլի կենսացիկլը և դրա շուրջ մաքրման մրցավազքը։ Այն անձեռնմխելի է թողնում գաղտնիքը հետագայում արտահոսելու բոլոր հնարավորությունները։ Այս սկրիպտներում ճշգրտության խնդիրը սովորաբար այլ տեղ է նստում, որովհետև ախտորոշումը և բանալու նյութը տարբեր հոսքերով են ճամփորդում։

Ֆայլը երբեք այն բացահայտումը չէր, ինչ դուք մտածում էիք

Ժամանակավոր ֆայլը կոնկրետ ռիսկ է, երբ այն բոլորի համար ընթեռնելի է, երբ այն վերապրում է խափանումը, կամ երբ բացառությունից հետո բաց է թողնվում մաքրման քայլը։ Դրանք իրական են, և արժե ուղղել։ Դրանք նաև տեղային են, տեսանելի և հեշտ փորձարկվող։ Անվանե՛ք յուրաքանչյուրը ձեր սեփական սկրիպտում, նախքան եզրակացնելը, որ փոփոխությունը միայն կոսմետիկ էր։

Ավելի հանգիստ ռիսկերը նստում են ներքևում՝ վրիպազերծման ընթացքում տպված բանալին, ամբողջ արդյունքի օբյեկտը սերիալացնող բացառությունը, միջուկային դամփ գրող խափանումների կարգավորիչը, ֆայլի ուղին և հետո բովանդակությունը ստացող մատյանների հավաքիչը։ Ժամանակավոր ֆայլից խուսափելը ոչ մեկի համար ոչինչ չի անում, և հակառակին հավատալը այն ճանապարհն է, որով բարի մտադրությամբ վերաշարադրումը գաղտնիքը թողնում է նախկինից ավելի բաց։ Փոփոխությունը դիտե՛ք որպես հաջորդականության մեջ մեկ բարելավում, ոչ որպես լուծում։

Ինչ է գրում հաճախորդը, երբ ֆայլի անուն չի տրվում

Հաճախորդի ընթացիկ տարբերակները գեներացված բանալին ուղարկում են ստանդարտ ելքին, երբ բանալու հրամանը տրվում է առանց ելքի ուղու։ Հենց այդ փաստաթղթավորված վարքն է հիշողության մեջ մոտեցումը կենսունակ դարձնում, և այն վերացնում է գործիքը սարքի ուղու վրա ուղղելու հին հնարքի կարիքը։

import subprocess
proc = subprocess.run(
    ["openvpn", "--genkey", "tls-crypt"],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    check=True,
)
key_material = proc.stdout

Փոխանցե՛ք հրամանը որպես ցանկ։ Այստեղ կեղևի ընդլայնում պետք չէ, և կեղև միացնելը արգումենտների սահմանը կախված կդարձներ ձեզ չվերահսկվող չակերտներից։ Օգտագործե՛ք նախատեսված գործարկվող ֆայլը բացարձակ ուղով, եթե սկրիպտը կարող է աշխատել ձեր սպասածից տարբեր որոնման ուղով։

Վերադարձի կոդի ստուգումը թույլ չի տալիս հաջողության ուղուն շարունակվել ձախողված կանչից հետո։ Առանց դրա՝ դատարկ բայթային տողը կարող է առաջ հոսել և ձախողվել միայն շատ ավելի ուշ՝ այն կետում, որտեղ բանալին օգտագործվում է, և սխալի հաղորդագրությունն այլևս բոլորովին չի հիշատակում գեներացումը։

Երկու հոսք, երկու իմաստ

Ստանդարտ ելքը կրում է բանալին։ Ստանդարտ սխալը կրում է այն ամենը, ինչ գործիքը ուզում է ձեզ ասել, ներառյալ նախազգուշացումները կարգավորման, տարբերակի և բանալու տեսակի մասին։ Երկուսն էլ մեկ բուֆերի մեջ ուղղելը այն սխալն է, որն ստեղծում է վստահելի տեսք ունեցող բանալի՝ մեջտեղում կարված նախադասությամբ։

Առանձին պահե՛ք նաև ձախողման ուղին։ Երբ կանչը ձախողվում է, հաղորդե՛ք ձախողված հրամանը և ելքի կարգավիճակը, ապա գիտակցաբար որոշե՛ք՝ արդյոք ստանդարտ սխալի որևէ մասը ցուցադրելու համար անվտանգ է։ Ամբողջ արդյունքի օբյեկտը մատյան թափելը սովորական կարճուղին է, և այն կարող է բանալին իր հետ տանել։

Երկուականի համար անվտանգ ընթերցումը կարևոր է, եթե հետագայում հեշավորեք կամ համեմատեք նյութը։ Անսպասելի կոդավորմամբ տեքստային ռեժիմը կարող է փոխել բայթեր, որոնք երբեք տեքստ լինելու համար չէին նախատեսված, և փոփոխված բանալին անտարբերելի է սխալից, մինչև ձեռքսեղմումը չձախողվի։

Եթե այնուամենայնիվ պահպանում եք, արե՛ք դա գիտակցաբար

Տեղակայումների մեծ մասը վերջիվերջո բանալին սկավառակի վրա, դարպասի վրա կամ գաղտնիքների պահոցում է ուզում։ Գրե՛ք այն մեկ անգամ՝ ստեղծման պահից սահմանափակող իրավունքներով, ոչ ուշ chmod-ով, և գրառումը դարձրե՛ք ատոմային, որ մասնակի ֆայլը երբեք չդառնա այն, ինչ ծառայությունը կարդում է գործարկման ժամանակ։ Նույն պանակի ուղուց վերանվանումը դրա համար սովորաբար բավարար է։ Հեռացրե՛ք նախապատրաստման ուղին ձախողման ճյուղում, որովհետև ձախողված գրառումը հենց այն պատճենն է, որ մարդիկ մոռանում են։

Սահմանե՛ք ֆայլի ռեժիմը ստեղծման պահին, և պահե՛ք նաև պանակի ռեժիմը սահմանափակող։ Խուսափե՛ք ցանկացած ուղուց այնպիսի տեղի տակ, որը պահուստային աշխատանքը առանց մտածելու ավլում է, որովհետև գիշերային պահուստում գտնվող գաղտնիքը գաղտնիք է այդ պահուստի յուրաքանչյուր պատճենում։ Նույն տրամաբանությունը վերաբերում է ընդհանուր ծավալին, որը այլ ծառայություններ կարող են կարդալ։

Ընդհանուր բանալին ինքնություն չէ

Այս նյութի գեներացումը վկայագիր չի թողարկում, հաճախորդ չի գրանցում և չի հաստատում, թե ով է միանում։ Ընդհանուր բանալին պաշտպանում է ալիք այն կողմերի միջև, որոնք արդեն վստահում են միմյանց· ինքնությունը դեռ գալիս է վկայագրից և դրա առջև նստած ցանկացած նույնականացումից։

Բանալու տեսակները նույնպես փոխարինելի չեն։ Մեկ հատկության համար սիմետրիկ բանալին պատրաստի փոխարինում չէ մյուսի համար, և ավելի նոր թողարկումներն ավելացնում են իրենց տարբերակները՝ յուրաքանչյուր ծայրում տարբեր ֆայլերով։ Գեներացրե՛ք այն տեսակը, որը ձեր կարգավորումն իսկապես անվանում է, ապա օգտագործե՛ք այն այն դերում, որը սահմանում է այդ տեսակը։

Փորձարկե՛ք արդյունքը իրական միացումով, ոչ թե ֆայլի չափը զննելով։ Եթե ձեռքսեղմումը ավարտվում է, և մատյանները բանալու նախազգուշացում չեն ցույց տալիս, գեներացման ուղին ճիշտ է· եթե բանալին կտրված լիներ միաձուլված հոսքով, միացումը կձախողվեր այնպես, որ մատներ ցույց կտար ոչ թե սկրիպտին, այլ զույգին։

Առնչվող հոդվածներ