Jinsi ya kuthibitisha faili kwa kutumia checksum Linux
Jifunze kutumia sha256sum kuhakiki upakuaji wako. Mwongozo huu unaonyesha hatua za kulinganisha hash na faili ya SHA256SUMS na jinsi mfumo unavyokataa faili iliyobadilishwa.
Thibitisha upakuaji kwa kutumia checksum ndani ya dakika mbili
Ili kuthibitisha upakuaji kwa kutumia checksum, tengeneza hash ya faili uliyopokea na uruhusu zana kulinganisha hash hiyo na ile iliyochapishwa na mchapishaji. sha256sum hufanya sehemu zote mbili za kazi hiyo: peke yake huchapisha digest, na kwa kutumia -c husoma orodha ya digest na kuripoti ni faili zipi zinazolingana. Mwongozo huu unaendesha mzunguko mzima kwenye faili unayotengeneza, kisha unaharibu faili hiyo kwa makusudi ili uone jinsi hitilafu inavyotokea badala ya kusoma kuihusu.
Kumbuka sentensi moja wakati wote wa mchakato huu. Checksum hukuambia kama baiti ulizonazo ndizo baiti zilizozalisha digest hiyo, na haikuambii chochote kuhusu nani aliyekuwa mzalishaji wake. Swali hilo la pili linahitaji sahihi na ufunguo unaouamini. Sehemu ya mwisho ya mwongozo huu inaonyesha wazi mahali ambapo mpaka kati ya vitu hivyo viwili upo.
Tengeneza faili ya kufanyia mazoezi
Fanya kazi kwenye saraka ya muda (scratch directory) ili hakuna kitu hapa kitakachoathiri mfumo wako wote. Kila amri iliyo hapa chini inatoka kwenye GNU coreutils, seti ya msingi ya amri inayopatikana kwenye seva yoyote ya Ubuntu au Debian, kwa hivyo hakuna kitu cha kusakinisha.
mkdir -p ~/checksum-demo
cd ~/checksum-demo
printf 'the payload of a totally ordinary download\n' > payload.txt
sha256sum payload.txtUtapata mstari mmoja: herufi 64 za hexadecimal, nafasi mbili, kisha jina la faili. Herufi hizo 64 ni digest ya faili hiyo. Endesha amri hiyo tena na mstari utakuwa sawa, kwa sababu hashing ni ya kihesabu (deterministic): ingizo lilelile hutoa matokeo yaleyale kila wakati. Badilisha herufi moja ya faili hiyo na uendeshe tena, na digest haitabadilika kidogo tu. Inaonekana tofauti kabisa, kwa sababu kubadilisha biti moja ya ingizo hubadilisha takriban nusu ya biti za matokeo. Sifa hiyo ndiyo inayofanya kamba ya herufi 64 kuwa mbadala inayoweza kutumika kwa ajili ya picha ya 4 GB.
Hifadhi faili ya SHA256SUMS, kisha uikague
Hash inayotokea kwenye skrini haina faida baada ya siku kupita. Iandike kwenye faili, kwa muundo ambao sha256sum yenyewe hutumia, ili zana hiyo iweze kuisoma baadaye.
sha256sum payload.txt > SHA256SUMS
cat SHA256SUMS
sha256sum -c SHA256SUMSsha256sum -c husoma kila mstari wa orodha hiyo, hufanya hashing ya faili iliyotajwa kwenye mstari huo, na kulinganisha hash hizo mbili. Uendeshaji uliofanikiwa huchapisha mstari mmoja kwa kila faili:
payload.txt: OKKagua pia exit status, kwa sababu script husoma hiyo na haisomi maandishi yoyote. echo $? huchapisha 0 baada ya uendeshaji safi. Jina SHA256SUMS ni utaratibu wa kawaida badala ya sheria, lakini usambazaji wa programu (distributions) na kurasa nyingi za releases hutumia jina hilo, kwa hivyo litumie pia ili mtu mwingine ajue faili hiyo ina nini bila kulifungua.
Badilisha byte moja na uone ukaguzi ukifeli
Sasa haribu faili kwa makusudi. Hii inaandika byte moja kwenye offset 5 na kuacha kila kitu kingine kama kilivyo, kwa hivyo faili linabaki na urefu wake na jina lake.
printf 'X' | dd of=payload.txt bs=1 seek=5 conv=notrunc status=none
cat payload.txt
sha256sum -c SHA256SUMSconv=notrunc ndiyo flag muhimu: bila hiyo, dd hufupisha faili kwenye sehemu inapoacha kuandika, na ungekuwa unajaribu aina ya uharibifu ulio dhahiri zaidi. Ukaguzi sasa unachapisha:
payload.txt: FAILED
sha256sum: WARNING: 1 computed checksum did NOT matchecho $? huchapisha 1. FAILED inamaanisha faili lilisomwa na digest yake haikulingana na ile iliyo kwenye orodha. Rudisha byte za asili na uthibitishe kuwa ukaguzi unarudi kwenye OK:
printf 'the payload of a totally ordinary download\n' > payload.txt
sha256sum -c SHA256SUMSHiyo ndiyo tabia nzima. Tofauti ya byte moja, popote kwenye faili, inazalisha FAILED. Download iliyokatika kwa sababu ya muunganisho uliopotea, mirror inayotoa toleo la jana, proxy iliyoandika upya faili wakati wa usafirishaji, au diski iliyorejesha block mbovu: yote hayo yanaishia kwenye mstari huo huo.
Wakati orodha inataja faili ambalo hukulipakua
Faili halisi la SHA256SUMS kutoka kwa msambazaji huorodhesha kila image ambayo mradi husafirisha, na wewe ulikua umepakua moja kati ya hizo. Rudia hali hiyo hapa.
printf 'a second file\n' > notes.txt
sha256sum payload.txt notes.txt > SHA256SUMS.all
rm notes.txt
sha256sum -c SHA256SUMS.allpayload.txt: OK
sha256sum: notes.txt: No such file or directory
notes.txt: FAILED open or read
sha256sum: WARNING: 1 listed file could not be readFAILED open or read ni hitilafu tofauti na FAILED, na kuchanganya hizo mbili hupoteza muda. FAILED inamaanisha kuwa baiti si sahihi. FAILED open or read inamaanisha kuwa sha256sum haikupata faili hilo kabisa, kwa hivyo hakuna kilicholinganishwa. Katika upakuaji halisi, sababu ya kawaida ni saraka ya kazi (working directory), kwa sababu majina yaliyo kwenye orodha yanahusiana na mahali unapoiendesha amri hiyo. Ingia kwenye saraka iliyo na faili hilo na uliendeshe tena. Ili kukagua kile ulichonacho tu, omba hicho:
sha256sum --ignore-missing -c SHA256SUMS.allHiyo huchapisha payload.txt: OK na kutoka kwa exit code 0. Ikiwa hakuna hata moja ya majina yaliyoorodheshwa yanayopatikana, --ignore-missing haifanikiwi kimya kimya kwenye faili sifuri. Inaripoti kuwa no file was verified na kutoka kwa exit code isiyo sifuri, ambayo ndiyo tabia unayotaka, kwa sababu uthibitisho uliokagua kitu chochote ni hitilafu ambayo usingewahi kuitambua.
Bandika digest iliyochapishwa bila kuisoma kwa macho
Kulinganisha herufi 64 za hexadecimal kwa macho ndipo mazoea haya yanapofeli kabisa. Watu huangalia herufi nne za kwanza na nne za mwisho na kusema zinalingana, na hiyo ndiyo kulinganisha hasa ambayo mshambuliaji aliyedhamiria anaitarajia. Acha zana ifanye kulinganisha badala yake. Weka EXPECTED kwenye digest uliyoinakili kutoka kwa mchapishaji, kwa kutumia EXPECTED= ikifuatiwa na thamani uliyobandika, kisha tengeneza mstari mmoja ambao -c inatarajia:
printf '%s %s\n' "$EXPECTED" payload.txt > payload.sha256
cat payload.sha256
sha256sum -c payload.sha256Nafasi mbili zipo kati ya digest na jina la faili, ndiyo maana kamba ya umbizo (format string) inabeba mbili. Hiyo ndiyo sura ambayo sha256sum huandika na sura ambayo -c husoma. Faili iliyo na digest pekee si mstari wa checksum hata kidogo, kwa hivyo ukaguzi hukataa faili nzima kwa no properly formatted checksum lines found badala ya kukisia ni faili ipi uliyokusudia. Miradi mingine huchapisha mtindo wa BSD tagged badala yake, SHA256 (payload.txt) = ikifuatiwa na digest. GNU coreutils huandika umbo hilo kwa sha256sum --tag payload.txt na kulisoma tena kwa -c, kwa hivyo umbo lolote ni sawa kuhifadhi.
Wakati ukaguzi unapoonekana kufanya kazi isivyo kawaida, angalia orodha yenyewe kwa cat -A SHA256SUMS, ambayo huashiria mwisho wa kila mstari kwa $ na kuonyesha herufi ambazo huwezi kuziona vinginevyo. Mstari unaoishia na ^M$ umebeba carriage return kutoka kwa kihariri cha Windows. GNU sha256sum hupuuza herufi hiyo ya mwisho na bado huchapisha OK, kwa hivyo orodha ya CRLF si kitu kinachovunja ukaguzi wako, ingawa zana zilizo nje ya coreutils hazisamehe sana kuhusu hilo. Sanifisha nakala unayohifadhi kwa tr -d '\r' < SHA256SUMS > SHA256SUMS.clean.
Checksum inathibitisha nini, na nini haithibitishi?
Checksum inathibitisha jambo moja: baiti zilizopo kwenye diski yako ndizo zilezile zilizozalisha digest iliyochapishwa. Hii inashughulikia kikamilifu uharibifu wa bahati mbaya. Pia inashughulikia mshambuliaji mzembe aliyebadilisha faili kwenye mirror ya kupakua lakini hakuweza kugusa ukurasa uliotangaza digest hiyo.
Haithibitishi chochote kuhusu utunzi. Digest ni ukweli kuhusu baiti, si ukweli kuhusu watu. Ikiwa ukurasa mmoja unatoa faili na digest, basi yeyote anayeweza kubadilisha moja anaweza kubadilisha nyingine, na mstari wako wa OK unamaanisha tu kwamba mirror inajikubali yenyewe. Kwa hivyo, hii ndiyo kanuni inayofanya checksum kuwa na thamani ya kutumika: chukua digest kutoka mahali pengine tofauti na pale ulipochukulia faili. Kwa mfano, kikoa cha mradi wenyewe kupitia TLS (transport layer security) wakati picha (image) ilitoka kwenye mirror au torrent. Sasa mshambuliaji anapaswa kudhibiti maeneo mawili badala ya moja. Pia haisemi chochote kuhusu kile ambacho baiti hizo zilizothibitishwa zitafanya pindi utakapozikimbiza, swali tofauti ambalo linafaa kuulizwa kwa chochote kinachotekelezwa kwa niaba yako, kuanzia hati ya usakinishaji hadi plugin ya dsh inayofanya kazi kwa ruhusa za agent wako.
Algorithm pia ni muhimu. SHA-256 (secure hash algorithm, 256-bit output) haina mgongano (collision) unaojulikana kufikia Agosti 2026, ndiyo maana wachapishaji wanaitumia. MD5 (message digest 5) na SHA-1 hazistahimili: faili mbili tofauti zenye digest sawa ya MD5 zimekuwa zikijengwa tangu 2004, na mgongano wa SHA-1 wa prefix iliyochaguliwa ulichapishwa mwaka 2020. Faili ya MD5SUMS bado inaweza kunasa upakuaji uliokatika, kwa sababu ufisadi wa nasibu (random corruption) si mgongano ulioundwa kwa makusudi. Haiwezi kumzuia mtu anayejaribu kukudanganya. Mradi unapochapisha zote mbili, chukua mstari wa SHA-256.
Mahali ambapo sahihi huchukua nafasi
Sahihi huziba pengo ambalo digest huacha wazi. Mchapishaji husaini faili ya digest kwa kutumia private key, na wewe huikagua kwa kutumia public key yao: gpg --verify SHA256SUMS.asc SHA256SUMS. Ikiwa ukaguzi huo utafaulu, orodha ya digests imetoka kwa yeyote anayemiliki ufunguo huo. Kisha sha256sum -c SHA256SUMS huunganisha faili iliyo kwenye diski yako na orodha hiyo, na mnyororo huanzia kwenye ufunguo hadi kwenye bytes zenyewe.
Sehemu dhaifu huhamia kwenye ufunguo. Kupakua ufunguo kutoka kwenye ukurasa uleule uliotoa faili hiyo humpa mshambuliaji sehemu zote mbili. GnuPG huwa wazi kuhusu hili, na uthibitishaji wa kwanza huchapisha Good signature pamoja na WARNING: This key is not certified with a trusted signature!. Good signature inamaanisha kuwa hesabu ni sahihi. Haimaanishi kuwa ufunguo huo ni wa mradi unaokusudia. Pata fingerprint kutoka chanzo cha pili, kama vile nyaraka za mradi kwenye domain nyingine au kifurushi cha usambazaji ambacho tayari kina ufunguo huo, na ulinganishe fingerprint nzima badala ya herufi nane za mwisho. Hii ni tahadhari sawa na ile inayostahili SSH private key, kwa sababu ileile: ufunguo ndio uamuzi wa kuaminiana, na kila kitu kinachofuata hurithi uaminifu huo.
Reproducible builds husukuma wazo hili hatua moja zaidi. Digest iliyochapishwa bado inakuunganisha na binary iliyojengwa na mashine moja. Wakati build ya mradi inaweza kurudiwa (reproducible), mtu yeyote anaweza kukusanya (compile) source ileile na kupata matokeo yanayofanana kwa kila byte, hivyo wajenzi huru wanaweza kuthibitisha digest iliyochapishwa badala ya kukuomba uamini neno la seva moja. Hili lina umuhimu zaidi kila mwaka, kadiri code nyingi zinavyofika kupitia automated pipelines na patches zilizoandikwa na mashine. Kuamua kile unachokubali kwenye build ni swali la sera, na sera za open source kwa code inayosaidiwa na AI hufanya kazi kwenye supply chain ileile kutoka upande mwingine.
Kisimamizi chako cha vifurushi tayari kinakufanyia hivi
Kwenye Debian na Ubuntu, apt huendesha mnyororo huu kila unaposakinisha kitu bila kuulizwa. Kielezo cha vifurushi hubeba SHA-256 digest kwa kila faili ya .deb. Faili ya Release hubeba digest za faili hizo za kielezo, na InRelease hubeba sahihi (signature) juu ya Release, inayokaguliwa dhidi ya funguo zilizopo kwenye /usr/share/keyrings na /etc/apt/trusted.gpg.d. Mnyororo huu unapovunjika, apt hutoa taarifa: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY wakati ufunguo wa hazina (repository) ya mtu wa tatu haupo, au Hash Sum mismatch wakati kielezo ulichopakua hakilingani na Release iliyotiwa sahihi, jambo ambalo kwa kawaida humaanisha kuwa caching proxy imetoa faili ya zamani au umekuta mirror ikiwa katikati ya kusawazisha (sync).
Huo ndio kiwango cha kulinganisha nacho wakati ukurasa wa nyumbani wa mradi unakuambia u-pipe script kutoka curl moja kwa moja kwenye shell. Hakuna kinachothibitisha zile bytes na huzioni kamwe. Seva inaweza pia kurejesha kitu kimoja kwa script na kitu kingine kwa kivinjari, na huna nakala ya kukagua baadaye. Pakua kwenye faili kwa kutumia curl -fsSL <url> -o install.sh, fanya hashing, isome kwa less, na uiendeshe hapo tu. Tabia hii inachukua takriban sekunde ishirini, na ni tabia ileile inayofaa kuanza nayo kwenye VPS mpya kabisa katika dakika zake kumi za kwanza, kabla ya kitu kingine chochote kusakinishwa kwenye mashine hiyo.
Tunza orodha ya digests kwa programu unazozisakinisha kwa mikono
Vifurushi vilivyosakinishwa na apt hufuatiliwa. Faili ya binary uliyoinakili kwenye /usr/local/bin haifuatiliwi, na hakuna kitu kwenye mfumo kinachoiangalia. Orodha ya digests huifanya kuwa kitu unachoweza kukikagua unapohitaji:
printf 'a second file\n' > notes.txt
sha256sum *.txt > inventory.sha256
sha256sum -c --quiet inventory.sha256--quiet haichapishi chochote wakati kila faili inalingana, na huchapisha tu mistari iliyoshindwa wakati baadhi hazilingani, kwa hivyo ukimya ni ishara ya kufaulu na echo $? inathibitisha hilo kwa 0. Hiyo ndiyo fomu ya kuweka kwenye kazi iliyoratibiwa. --status huenda mbali zaidi na haichapishi chochote kabisa, ikikuachia hali ya kutoka (exit status) pekee. Elekeza muundo huo huo kwenye faili halisi ukitumia sha256sum /usr/local/bin/* > ~/local-bin.sha256 na utakuwa na msingi wa kulinganishia (baseline). Njia (paths) huhifadhiwa kwenye orodha kama ulivyozichapa, kwa hivyo njia kamili (absolute paths) hufanya ukaguzi ufanye kazi kutoka saraka yoyote.
Kuwa wazi kuhusu thamani ya msingi huo. Inagundua faili iliyobadilishwa. Haigundui mshambuliaji ambaye tayari ana root, kwa sababu mshambuliaji huyo anaweza kuandika upya inventory.sha256 kwa urahisi kama alivyoiandika upya binary hiyo. Weka orodha hiyo nje ya mashine ikiwa unataka iwe na maana yoyote, jambo ambalo ni sehemu ya swali pana la ni kiasi gani cha VPS unachokiamini kweli na ni nani mwingine anayeweza kufikia diski iliyo chini yake.
FAQ
Je, checksum inayolingana inamaanisha kuwa faili iliyopakuliwa ni salama?
Hapana. Inamaanisha tu kuwa baiti ulizonazo zinalingana na digest uliyolinganisha nayo. Ikiwa mshambuliaji anadhibiti ukurasa uliotoa digest hiyo, atachapisha digest ya faili yake mwenyewe na ukaguzi wako utatoa OK. Kulingana kwa digest ni uthibitisho wa uthabiti wa data pekee. Uthibitisho wa usalama unahitaji sahihi (signature) iliyothibitishwa dhidi ya ufunguo (key) ulioupata kutoka chanzo kingine, na hapo ndipo digest hupata uaminifu huo.
Kwa nini sha256sum -c inatoa FAILED open or read?
Kwa sababu haikusoma faili hiyo. Mstari tofauti hapo juu unasema No such file or directory pamoja na jina ililotafuta. Majina yaliyo ndani ya faili ya SHA256SUMS yanahusiana na saraka (directory) unayoiendeshea amri hiyo, kwa hivyo ingia kwenye saraka iliyo na faili uliyopakua na uendeshe tena. Ikiwa orodha hiyo inataja faili ambazo hukupakua, ongeza --ignore-missing. FAILED tupu bila open or read ni hali tofauti: faili ilisomwa, na digest yake haikulingana.
Je, MD5 inatosha kuthibitisha faili iliyopakuliwa?
Kwa uharibifu wa bahati mbaya, ndiyo. Uhamisho uliokatika au block mbaya ya diski haitazalisha digest ya MD5 inayolingana kwa bahati. Dhidi ya mshambuliaji, hapana. Faili mbili tofauti zenye digest sawa ya MD5 zimekuwa zikijengwa tangu 2004, na SHA-1 ilishindwa dhidi ya mashambulizi ya chosen-prefix mnamo 2020. Tumia mstari wa SHA-256 wakati mradi unatoa zote mbili, na chukulia mradi unaotoa MD5 pekee kama ishara ya mchakato wa zamani wa kutoa matoleo.
Kuna tofauti gani kati ya sha256sum -c na gpg --verify?
sha256sum -c inathibitisha kuwa faili inalingana na digest. gpg --verify inathibitisha kuwa faili ya digest ilisainiwa na mwenye ufunguo binafsi (private key) husika. Yanajibu maswali tofauti, kwa hivyo endesha yote mawili wakati mradi unatoa yote. Sahihi inafanya orodha ya digest kuwa ya kuaminika, na orodha ya digest inafanya faili iliyopakuliwa kuwa ya kuaminika.
Ninawezaje kukagua faili moja dhidi ya digest iliyochapishwa kwenye ukurasa wa wavuti?
Usilinganishe herufi kwa macho. Hifadhi digest na jina la faili kwenye mstari mmoja, zikitenganishwa na nafasi mbili, kisha endesha sha256sum -c dhidi ya faili hiyo na usome OK au FAILED inayotolewa. Kujenga mstari huo kwa kutumia printf '%s %s\n' huepuka makosa ya mpangilio yanayofanya sha256sum ikatae faili hiyo kwa no properly formatted checksum lines found.