SSD Nodes Learn 🎉 VPS kutoka $5.50/mwezi
Mwongozo Matt ConnorNa Matt Connor · Imeboreshwa 2026-08-13

Jinsi ya kuthibitisha faili kwa kutumia sha256sum

Jifunze kutumia sha256sum kuhakiki upakuaji wako wa Linux. Mwongozo huu unaonyesha jinsi ya kulinganisha hash na kuona hitilafu halisi wakati baiti moja inapobadilishwa kwenye faili.

Thibitisha upakuaji kwa kutumia checksum ndani ya dakika mbili

Ili kuthibitisha upakuaji kwa kutumia checksum, fanya hashing 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 mchakato mzima kwenye faili unayotengeneza, kisha unaharibu faili hiyo kwa makusudi ili uone jinsi hitilafu inavyotokea badala ya kusoma kuihusu.

Kumbuka sentensi moja katika mchakato mzima. 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 hasa mahali ambapo mstari kati ya mambo hayo mawili ulipo.

Tengeneza faili ya kufanyia mazoezi

Fanya kazi kwenye saraka ya muda (scratch directory) ili hakuna kitu hapa kitakachoathiri mfumo wako. Kila amri hapa chini inatoka kwenye GNU coreutils, seti ya msingi ya amri inayopatikana kwenye seva yoyote ya Ubuntu au Debian, kwa hivyo hakuna haja ya kusakinisha chochote.

mkdir -p ~/checksum-demo
cd ~/checksum-demo
printf 'the payload of a totally ordinary download\n' > payload.txt
sha256sum payload.txt

Utapata mstari mmoja: vibambo 64 vya hexadecimal, nafasi mbili, kisha jina la faili. Vibambo hivyo 64 ni digest ya faili hiyo. Endesha amri hiyo tena na utaona mstari huo ni uleule, kwa sababu hashing ni ya kihesabu (deterministic): ingizo lilelile hutoa matokeo yaleyale kila wakati. Badilisha kibambo kimoja cha faili hiyo na uendeshe amri tena, digest haitabadilika kidogo tu. Itaonekana tofauti kabisa, kwa sababu kubadilisha biti moja ya ingizo hubadilisha takriban nusu ya biti za matokeo. Sifa hiyo ndiyo inayofanya kamba ya vibambo 64 kuwa mbadala unaofaa kwa ajili ya image ya 4 GB.

Hifadhi faili ya SHA256SUMS, kisha uikague

Ujumbe wa digest kwenye skrini haufai kitu baada ya siku kupita. Iandike kwenye faili, kwa umbizo ambalo sha256sum yenyewe huandika, ili zana hiyo iweze kuisoma baadaye.

sha256sum payload.txt > SHA256SUMS
cat SHA256SUMS
sha256sum -c SHA256SUMS

sha256sum -c husoma kila mstari wa orodha hiyo, hufanya hashing ya faili iliyotajwa kwenye mstari huo, na kulinganisha digest hizo mbili. Uendeshaji uliofanikiwa huchapisha mstari mmoja kwa kila faili:

payload.txt: OK

Kagua pia exit status, kwa sababu hati (script) husoma hiyo na haisomi maandishi. echo $? huchapisha 0 baada ya uendeshaji safi. Jina SHA256SUMS ni mkataba wa kawaida badala ya sheria, lakini usambazaji wa programu (distributions) na kurasa nyingi za releases hutumia jina hilo, kwa hivyo litumie pia ili mtu anayefuata ajue faili hiyo ina nini bila kuifungua.

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 SHA256SUMS

conv=notrunc ndiyo flag muhimu: bila hiyo, dd hukata faili kwenye sehemu inapoacha kuandika, na ungekuwa unajaribu aina ya uharibifu dhahiri zaidi. Ukaguzi sasa unachapisha:

payload.txt: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match

echo $? inachapisha 1. FAILED inamaanisha faili lilisomwa na digest yake haikulingana na ile iliyo kwenye orodha. Rudisha byte asilia na uthibitishe kuwa ukaguzi unarudi kwenye OK:

printf 'the payload of a totally ordinary download\n' > payload.txt
sha256sum -c SHA256SUMS

Hiyo ndiyo tabia nzima. Tofauti ya byte moja, popote kwenye faili, inazalisha FAILED. Upakuaji uliokatika kwa sababu ya muunganisho uliopotea, mirror inayotoa toleo la jana, proxy iliyobadilisha faili wakati wa usafirishaji, au diski iliyorejesha block mbaya: 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 umepakua moja wapo. Rudia hali hiyo hapa.

printf 'a second file\n' > notes.txt
sha256sum payload.txt notes.txt > SHA256SUMS.all
rm notes.txt
sha256sum -c SHA256SUMS.all
payload.txt: OK
sha256sum: notes.txt: No such file or directory
notes.txt: FAILED open or read
sha256sum: WARNING: 1 listed file could not be read

FAILED open or read ni hitilafu tofauti na FAILED, na kuchanganya hizo mbili hupoteza muda. FAILED inamaanisha baiti si sahihi. FAILED open or read inamaanisha 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 unapoendesha amri hiyo. Ingia kwenye saraka iliyo na faili hilo na uendeshe tena. Ili kukagua kile ulichonacho tu, omba hicho:

sha256sum --ignore-missing -c SHA256SUMS.all

Hiyo huchapisha payload.txt: OK na kutoka kwa exit code 0. Ikiwa hakuna hata jina moja lililoorodheshwa lililopo, --ignore-missing haifanikiwi kimyakimya kwenye faili sifuri. Inaripoti kuwa no file was verified na kutoka kwa exit code isiyo sifuri, ambayo ndiyo tabia unayotaka, kwa sababu uthibitisho ambao haukukagua kitu chochote ni hitilafu ambayo hutawahi kuigundua.

Bandika digest iliyochapishwa bila kuikagua kwa macho

Kulinganisha vibambo 64 vya hexadecimal kwa macho ndipo mazoea haya yanapofeli. Watu hukagua vibambo vinne vya kwanza na vinne vya mwisho na kusema vinalingana, na hiyo ndiyo kulinganisha hasa ambayo mshambuliaji aliyedhamiria huitegemea. Acha zana ifanye kulinganisha. Weka EXPECTED kwenye digest uliyokopi kutoka kwa mchapishaji, kwa kutumia EXPECTED= ikifuatiwa na thamani uliyobandika, kisha jenga mstari mmoja ambao -c inatarajia:

printf '%s  %s\n' "$EXPECTED" payload.txt > payload.sha256
cat payload.sha256
sha256sum -c payload.sha256

Nafasi mbili huwekwa 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 kubahatisha faili uliyokusudia. Miradi mingine huchapisha mtindo wa BSD tagged badala yake, SHA256 (payload.txt) = ikifuatiwa na digest. GNU coreutils huandika umbizo hilo kwa sha256sum --tag payload.txt na kulisoma tena kwa -c, kwa hivyo umbizo lolote linafaa kuhifadhiwa.

Ukaguzi unapoleta hitilafu, angalia orodha yenyewe kwa cat -A SHA256SUMS, ambayo huashiria mwisho wa kila mstari kwa $ na kuonyesha vibambo ambavyo huwezi kuviona vinginevyo. Mstari unaoishia na ^M$ umebeba carriage return kutoka kwa kihariri cha Windows. GNU sha256sum hupuuza kibambo hicho cha mwisho na bado huchapisha OK, kwa hivyo orodha ya CRLF si kitu kinachovunja ukaguzi wako, ingawa zana zilizo nje ya coreutils hazisamehi 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 kupakulia 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 kutumiwa: chukua digest kutoka mahali pengine tofauti na pale ulipochukua faili. Kwa mfano, kikoa cha mradi wenyewe kupitia TLS (transport layer security) wakati picha ya faili ilitoka kwenye mirror au torrent. Sasa mshambuliaji anapaswa kudhibiti maeneo mawili badala ya moja.

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 kugundua upakuaji uliokatika, kwa sababu ufisadi wa nasibu si mgongano uliotengenezwa 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 za faili.

Sehemu dhaifu huhamia kwenye ufunguo. Kupakua ufunguo kutoka kwenye ukurasa uleule uliotoa faili 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 unaoufikiria. Pata fingerprint kutoka chanzo cha pili, kama vile nyaraka za mradi kwenye domain tofauti 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 private key ya SSH, kwa sababu hiyo hiyo: 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 byte kwa byte, hivyo wajenzi huru wanaweza kuthibitisha digest iliyochapishwa badala ya kukuomba uamini neno la seva moja. Hili linazidi kuwa muhimu kila mwaka, kadiri code nyingi zinavyoingia kupitia automated pipelines na patches zilizoandikwa na mashine. Kuamua nini unachokubali kwenye build ni swali la sera, na sera za open source kwa code zinazosaidiwa na AI hufanya kazi kwenye supply chain ileile kutoka upande wa pili.

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 ya kidijitali juu ya Release, inayothibitishwa 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 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 data.

Hiyo ndiyo kiwango cha kulinganisha nacho wakati ukurasa wa nyumbani wa mradi unakuambia uelekeze script kutoka curl moja kwa moja kwenye shell. Hakuna kinachothibitisha zile bytes na huzioni kamwe. Seva inaweza pia kurudisha 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 baada ya hapo tu. Tabia hii inachukua sekunde ishirini hivi, na ndiyo 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 ajili ya kile unachokisakinisha 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 iliyopangwa (scheduled job). --status huenda mbali zaidi na haichapishi chochote kabisa, ikikuachia hali ya kutoka (exit status) pekee. Elekeza muundo uleule kwenye faili halisi kwa kutumia sha256sum /usr/local/bin/* > ~/local-bin.sha256 na utakuwa na msingi (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. Hugundua 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 kikweli na nani mwingine anayeweza kufikia diski iliyo chini yake.

FAQ

Does a matching checksum mean the download is safe?

No. It means the bytes you have match the digest you compared them against. If the attacker controls the page that published the digest, they publish the digest of their own file and your check prints OK. A match is a consistency claim. A safety claim needs a signature verified against a key you obtained from a different source, and only then does the digest inherit that trust.

Why does sha256sum -c print FAILED open or read?

Because it never read the file. A separate line just above it says No such file or directory with the name it looked for. The names inside a SHA256SUMS file are relative to the directory you run the command in, so change into the directory holding the download and run it again. If the list also names files you did not download, add --ignore-missing. A plain FAILED with no open or read is the opposite situation: the file was read, and its digest did not match.

Is MD5 good enough for verifying a download?

For accidental damage, yes. A truncated transfer or a bad disk block will not produce a matching MD5 digest by chance. Against an attacker, no. Two different files with the same MD5 digest have been constructible since 2004, and SHA-1 fell to a chosen-prefix collision in 2020. Take the SHA-256 line when a project publishes both, and read an MD5-only project as a sign of an old release process.

What is the difference between sha256sum -c and gpg --verify?

sha256sum -c proves a file matches a digest. gpg --verify proves a digest file was signed by the holder of a particular private key. They answer different questions, so run both when a project offers both. The signature makes the digest list trustworthy, and the digest list then makes the downloaded file trustworthy.

How do I check one file against a digest printed on a web page?

Do not compare the characters by eye. Save the digest and the file name on a single line, separated by two spaces, then run sha256sum -c against that file and read the OK or FAILED it prints. Building the line with printf '%s %s\n' avoids the formatting mistakes that make sha256sum reject the file with no properly formatted checksum lines found.

#checksums#sha256sum#integrity#supply-chain#security