Gjenerimi i çelësit nuk kërkon një skedar të përkohshëm, dhe heqja e tij rregullon më pak sesa sugjerojnë shumica e udhëzuesve. Ajo që heq është një cikël jete skedari dhe gara e pastrimit rreth tij. Ajo që lë të paprekur është çdo mundësi për të rrjedhur sekretin më pas. Problemi i saktësisë në këto skripte zakonisht qëndron diku tjetër, sepse diagnostikimi dhe materiali i çelësit udhëtojnë në rrjedha të ndryshme.

Skedari nuk ishte kurrë ai ekspozim që menduat

Një skedar i përkohshëm është një rrezik konkret kur është i lexueshëm nga të gjithë, kur i mbijeton një përplasjeje ose kur një hap pastrimi anashkalohet pas një përjashtimi. Këto janë reale dhe ia vlen të rregullohen. Ato janë gjithashtu lokale, të dukshme dhe të lehta për t'u testuar. Emërtoni secilin në skriptin tuaj përpara se të arrini në përfundimin që ndryshimi ishte thjesht kozmetik.

Rreziqet më të qeta qëndrojnë në rrjedhën e poshtme: çelësi i shtypur gjatë korrigjimit, përjashtimi që serializon të gjithë objektin e rezultatit, trajtuesi i përplasjes që shkruan një dump memorieje, grumbulluesi i regjistrave që merr shtegun e skedarit dhe pastaj përmbajtjen. Shmangia e një skedari të përkohshëm nuk bën asgjë për asnjë prej tyre, dhe besimi i të kundërtës është mënyra se si një rishkrim me qëllim të mirë e lë sekretin më të ekspozuar se më parë. Trajtojeni ndryshimin si një përmirësim në një sekuencë, jo si zgjidhjen.

Çfarë shkruan klienti kur nuk jepet emër skedari

Versionet aktuale të klientit e dërgojnë çelësin e gjeneruar në daljen standarde kur komanda e çelësit jepet pa një shteg daljeje. Pikërisht kjo sjellje e dokumentuar e bën të zbatueshëm qasjen në memorie, dhe heq nevojën për trukun më të vjetër të drejtimit të mjetit në një shteg pajisjeje.

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

Kalo komandën si listë. Këtu nuk nevojitet zgjerim i guaskës, dhe aktivizimi i një guaske do ta bënte kufirin e argumenteve të varur nga thonjëza që nuk i kontrolloni. Përdor ekzekutuesin e synuar me shteg absolut nëse skripti mund të ekzekutohet me një shteg kërkimi të ndryshëm nga ai që prisni.

Kontrolli i kodit të kthimit nuk lejon që rruga e suksesit të vazhdojë pas një thirrjeje të dështuar. Pa atë, një varg bajtesh bosh mund të rrjedhë përpara dhe të dështojë vetëm shumë më vonë, në pikën ku përdoret çelësi dhe mesazhi i gabimit nuk përmend më fare gjenerimin.

Dy rrjedha, dy kuptime

Dalja standarde mbart çelësin. Gabimi standard mbart gjithçka që mjeti dëshiron t'ju thotë, duke përfshirë paralajmërime për konfigurimin, versionin dhe llojin e çelësit. Ridrejtimi i të dyjave në një tampon të vetëm është gabimi që prodhon një çelës me pamje të besueshme me një fjali të qepur në mes.

Mbani të ndarë edhe rrugën e dështimit. Kur thirrja dështon, raportoni komandën që dështoi dhe statusin e daljes, dhe pastaj vendosni me vetëdije nëse ndonjë pjesë e gabimit standard është e sigurt për t'u shfaqur. Hedhja e të gjithë objektit të rezultatit në një regjistër është shkurtesa e zakonshme, dhe mund ta marrë çelësin me vete.

Leximi i sigurt për binare ka rëndësi nëse më vonë e hash-oni materialin ose e krahasoni. Modaliteti i tekstit me një kodim të papritur mund të ndryshojë bajte që nuk ishin destinuar kurrë të ishin tekst, dhe një çelës i ndryshuar nuk dallohet nga një i gabuar derisa të dështojë një shtrëngim duarsh.

Nëse gjithsesi e ruani, bëjeni me vetëdije

Shumica e vendosjeve përfundimisht kanë nevojë për çelësin në disk, në portë ose në një depo sekretesh. Shkruajeni një herë, me leje kufizuese që nga krijimi dhe jo me chmod të mëvonshëm, dhe bëjeni shkrimin atomik që një skedar i pjesshëm të mos bëhet kurrë ai që një shërbim lexon në nisje. Një riemërtim nga një shteg në të njëjtin drejtori zakonisht mjafton për këtë. Hiqni shtegun e përgatitjes në degën e dështimit, sepse shkrimi i dështuar është pikërisht kopja që njerëzit harrojnë.

Vendosni modalitetin e skedarit kur krijohet, dhe mbani kufizues edhe modalitetin e drejtorisë. Shmangni çdo shteg nën një vend që një punë rezervë e fshin pa menduar, sepse një sekret në një kopje rezervë nate është sekret në çdo kopje të asaj kopje. I njëjti arsyetim vlen për një vëllim të përbashkët që shërbime të tjera mund ta lexojnë.

Një çelës i përbashkët nuk është identitet

Gjenerimi i këtij materiali nuk lëshon certifikatë, nuk regjistron një klient dhe nuk përcakton se kush lidhet. Çelësi i përbashkët mbron një kanal midis palëve që tashmë i besojnë njëra-tjetrës; identiteti ende vjen nga certifikata dhe nga çdo vërtetim që qëndron përpara saj.

As llojet e çelësave nuk janë të këmbyeshme. Një çelës simetrik për një veçori nuk është zëvendësim i drejtpërdrejtë për një tjetër, dhe lëshimet më të reja shtojnë variantet e tyre me skedarë të ndryshëm në secilin skaj. Gjeneroni llojin që konfigurimi juaj e emërton vërtet, dhe pastaj përdoreni në rolin që ai lloj përcakton.

Testoni rezultatin me një lidhje të vërtetë në vend që të inspektoni madhësinë e skedarit. Nëse shtrëngimi i duarve përfundon dhe regjistrat nuk tregojnë paralajmërime çelësi, rruga e gjenerimit është e saktë; nëse çelësi do të ishte prerë nga një rrjedhë e bashkuar, lidhja do të dështonte në një mënyrë që tregon palën tjetër dhe jo skriptin.

Artikuj të ngjashëm