Linux'ta dosya bütünlüğü sha256sum ile nasıl doğrulanır?
sha256sum komutu ile dosya özetlerini karşılaştırın. Bir bayt değişikliğinin hata mesajını nasıl tetiklediğini görerek sağlama toplamı mantığını adım adım kavrayın.
İndirilen bir dosyayı iki dakika içinde sağlama toplamı ile doğrulama
İndirilen bir dosyayı sağlama toplamı (checksum) ile doğrulamak için, elinizdeki dosyanın özetini (hash) alın ve bu özeti yayıncının belirttiği değerle karşılaştırın. sha256sum aracı bu işlemin her iki aşamasını da gerçekleştirir: tek başına kullanıldığında bir özet çıktısı verir, -c bayrağı ile kullanıldığında ise bir özet listesini okur ve hangi dosyaların eşleştiğini raporlar. Bu kılavuz, oluşturacağınız bir dosya üzerinde tüm süreci işletir, ardından hatanın nasıl oluştuğunu görmeniz için dosyayı kasten bozar.
Süreç boyunca şu cümleyi aklınızda tutun: Bir sağlama toplamı, elinizdeki baytların özeti oluşturan baytlarla aynı olup olmadığını söyler; ancak bu baytları kimin ürettiği hakkında hiçbir bilgi vermez. İkinci soru, bir imza ve güvendiğiniz bir anahtar gerektirir. Bu kılavuzun son bölümü, bu iki kavram arasındaki sınırın tam olarak nerede olduğunu gösterir.
Uygulama için bir dosya oluşturun
Sistemin geri kalanına müdahale etmemek için geçici bir dizinde çalışın. Aşağıdaki tüm komutlar, herhangi bir Ubuntu veya Debian sunucusunda bulunan temel komut seti GNU coreutils'e aittir; bu nedenle kurulması gereken hiçbir şey yoktur.
mkdir -p ~/checksum-demo
cd ~/checksum-demo
printf 'the payload of a totally ordinary download\n' > payload.txt
sha256sum payload.txtTek bir satır elde edersiniz: 64 onaltılık karakter, iki boşluk ve ardından dosya adı. Bu 64 karakter, dosyanın özetidir (digest). Komutu tekrar çalıştırdığınızda satır aynı kalır, çünkü hashing deterministiktir: aynı girdi her zaman aynı çıktıyı verir. Dosyada tek bir karakteri değiştirip tekrar çalıştırdığınızda, özet biraz değişmez. Tamamen farklı görünür, çünkü girdideki tek bir bitin değişmesi çıktıdaki bitlerin yaklaşık yarısını değiştirir. Bu özellik, 64 karakterlik bir dizgiyi 4 GB'lık bir imaj dosyası için kullanılabilir bir temsilci haline getirir.
Bir SHA256SUMS dosyası kaydedin ve doğrulayın
Ekranda görünen bir özet değeri, bir gün sonra hiçbir işe yaramaz. Bu değeri, sha256sum aracının kendi yazdığı formatta bir dosyaya kaydedin; böylece araç, dosyayı daha sonra tekrar okuyabilir.
sha256sum payload.txt > SHA256SUMS
cat SHA256SUMS
sha256sum -c SHA256SUMSsha256sum -c, listedeki her satırı okur, satırda belirtilen dosyanın özet değerini hesaplar ve iki değeri karşılaştırır. Sorunsuz bir işlem, her dosya için bir satır çıktı üretir:
payload.txt: OKÇıkış durumunu da kontrol edin; çünkü bir betik metni değil, bu durumu okur. echo $?, hatasız bir işlemden sonra 0 çıktısını verir. SHA256SUMS ismi bir kuraldan ziyade bir gelenektir, ancak dağıtımlar ve çoğu sürüm sayfası bu ismi kullandığı için siz de bunu kullanın; böylece bir sonraki kişi dosyayı açmadan içinde ne olduğunu anlar.
Bir baytı değiştirin ve denetimin başarısız olmasını izleyin
Şimdi dosyayı kasten bozun. Bu işlem, 5 numaralı ofsette tek bir bayt yazar ve diğer her şeyi olduğu gibi bırakır; böylece dosya uzunluğunu ve adını korur.
printf 'X' | dd of=payload.txt bs=1 seek=5 conv=notrunc status=none
cat payload.txt
sha256sum -c SHA256SUMSconv=notrunc önemli olan bayraktır: bu bayrak olmadan dd dosyayı yazmayı durdurduğu noktada keser ve çok daha belirgin bir hasar türünü test etmiş olursunuz. Denetim artık şunu yazdırır:
payload.txt: FAILED
sha256sum: WARNING: 1 computed checksum did NOT matchecho $?, 1 çıktısını verir. FAILED, dosyanın okunduğu ancak özetinin (digest) listedekiyle eşleşmediği anlamına gelir. Orijinal baytları geri yükleyin ve denetimin OK sonucuna döndüğünü doğrulayın:
printf 'the payload of a totally ordinary download\n' > payload.txt
sha256sum -c SHA256SUMSTüm alışkanlık bundan ibarettir. Dosyanın herhangi bir yerindeki tek bir baytlık fark, FAILED sonucunu üretir. Bağlantı kopması nedeniyle yarım kalan bir indirme, dünün sürümünü sunan bir yansıma (mirror), dosyayı iletim sırasında yeniden yazan bir proxy veya hatalı blok döndüren bir disk: hepsi aynı satıra çıkar.
Liste indirmediğiniz bir dosyayı içerdiğinde
Bir dağıtımdan alınan gerçek bir SHA256SUMS dosyası, projenin sunduğu her imajı listeler; siz ise bunlardan yalnızca birini indirdiniz. Bu durumu burada yeniden oluşturun.
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, FAILED ile farklı bir hatadır ve ikisini karıştırmak zaman kaybına yol açar. FAILED, baytların hatalı olduğu anlamına gelir. FAILED open or read ise sha256sum dosyanın hiçbir şekilde edinilemediğini, dolayısıyla karşılaştırma yapılamadığını belirtir. Gerçek bir indirme işleminde yaygın hata sebebi çalışma dizinidir; çünkü listedeki isimler komutu çalıştırdığınız dizine göre görelidir. Dosyanın bulunduğu dizine geçin ve komutu tekrar çalıştırın. Yalnızca elinizde olanı kontrol etmek için şunu kullanın:
sha256sum --ignore-missing -c SHA256SUMS.allBu komut payload.txt: OK çıktısını verir ve 0 koduyla çıkar. Listelenen isimlerden hiçbiri mevcut değilse, --ignore-missing sıfır dosya üzerinde sessizce başarılı olmaz. Bunun yerine no file was verified şeklinde bir hata bildirir ve sıfır olmayan bir kodla çıkar; bu, beklenen davranıştır. Çünkü hiçbir şeyi kontrol etmeyen bir başarı, fark edemeyeceğiniz bir hata türüdür.
Yayınlanmış bir özeti gözle kontrol etmeden yapıştırın
64 karakterlik onaltılık (hexadecimal) dizileri gözle karşılaştırmak, bu alışkanlığın en zayıf noktasıdır. İnsanlar genellikle ilk dört ve son dört karakteri kontrol edip eşleştiğine karar verir; kararlı bir saldırgan tam olarak bu karşılaştırma yöntemine göre hareket eder. Karşılaştırma işlemini araca bırakın. Yayıncıdan kopyaladığınız özeti EXPECTED değişkenine atayın, EXPECTED= komutunu ve ardından yapıştırdığınız değeri kullanarak -c aracının beklediği tek satırı oluşturun:
printf '%s %s\n' "$EXPECTED" payload.txt > payload.sha256
cat payload.sha256
sha256sum -c payload.sha256Özet ile dosya adı arasında iki boşluk bulunur; biçim dizgisinin iki boşluk içermesinin nedeni budur. Bu, sha256sum aracının yazdığı ve -c aracının ayrıştırdığı biçimdir. Sadece özet bilgisini içeren bir dosya, teknik olarak bir sağlama toplamı (checksum) satırı değildir; bu nedenle kontrol işlemi, hangi dosyayı kastettiğinizi tahmin etmek yerine no properly formatted checksum lines found hatası vererek tüm dosyayı reddeder. Bazı projeler bunun yerine SHA256 (payload.txt) = ve ardından özet bilgisini içeren BSD etiketli biçimi yayınlar. GNU coreutils bu biçimi sha256sum --tag payload.txt ile yazar ve -c ile okur; dolayısıyla her iki biçim de saklamak için uygundur.
Bir kontrol işlemi beklenmedik şekilde sonuçlanırsa, cat -A SHA256SUMS komutu ile listenin kendisini inceleyin. Bu komut, her satırın sonunu $ ile işaretler ve normalde görünmeyen karakterleri gösterir. ^M$ ile biten bir satır, Windows tabanlı bir düzenleyiciden kaynaklanan bir satır başı (carriage return) karakteri almış demektir. GNU sha256sum aracı bu sondaki karakteri görmezden gelir ve yine de OK çıktısını verir; bu nedenle CRLF biçimindeki bir liste kontrol işleminizi bozmaz, ancak coreutils dışındaki araçlar bu konuda daha az toleranslı olabilir. Elinizde tuttuğunuz kopyayı tr -d '\r' < SHA256SUMS > SHA256SUMS.clean ile normalleştirin.
Sağlama toplamı (checksum) neyi kanıtlar, neyi kanıtlamaz?
Bir sağlama toplamı tek bir şeyi kanıtlar: diskinizdeki baytlar, yayınlanan özeti (digest) oluşturan baytlarla aynıdır. Bu durum, kazara oluşan hasarları tamamen kapsar. Ayrıca, dosyayı bir indirme yansımasında (mirror) değiştiren ancak özeti yayınlayan sayfaya erişemeyen dikkatsiz bir saldırganı da kapsar.
Yazarlık konusunda hiçbir şeyi kanıtlamaz. Bir özet, insanlar hakkında değil, baytlar hakkında bir gerçektir. Eğer bir sayfa hem dosyayı hem de özeti sunuyorsa, birini değiştirebilen kişi diğerini de değiştirebilir; bu durumda OK satırınız, yansımanın yalnızca kendi içinde tutarlı olduğu anlamına gelir. Sağlama toplamlarını çalıştırmaya değer kılan kural şudur: özeti, dosyayı aldığınız yerden farklı bir kaynaktan alın. Örneğin, dosya bir yansımadan veya torrent üzerinden gelirken, projenin kendi alan adından TLS (transport layer security) üzerinden özet değerini almak gibi. Artık bir saldırganın bir yer yerine iki yeri kontrol etmesi gerekir.
Algoritma da önemlidir. SHA-256 (secure hash algorithm, 256-bit output), Ağustos 2026 itibarıyla bilinen bir çakışmaya (collision) sahip değildir; yayıncıların bunu kullanma nedeni budur. MD5 (message digest 5) ve SHA-1 artık güvenilir değildir: aynı MD5 özetine sahip iki farklı dosya 2004 yılından beri oluşturulabilmektedir ve seçilmiş önekli (chosen-prefix) bir SHA-1 çakışması 2020 yılında yayınlanmıştır. Bir MD5SUMS dosyası yine de kesintiye uğramış bir indirmeyi tespit eder, çünkü rastgele bozulma, kurgulanmış bir çakışma değildir. Sizi kandırmaya çalışan birini durduramaz. Bir proje her ikisini de yayınladığında, SHA-256 satırını esas alın.
İmzaların devreye girdiği nokta
İmza, özetin (digest) açık bıraktığı boşluğu kapatır. Yayıncı, özet dosyasını özel bir anahtarla imzalar ve siz de bunu genel anahtarlarıyla gpg --verify SHA256SUMS.asc SHA256SUMS üzerinden doğrularsınız. Bu işlem başarılı olursa, özet listesinin o anahtarı elinde bulunduran kişiden geldiği kesinleşir. Ardından sha256sum -c SHA256SUMS, diskinizdeki dosyayı listeye bağlar ve zincir, anahtardan dosya baytlarına kadar kesintisiz uzanır.
Zayıf nokta anahtara kayar. Anahtarı, dosyayı sunan sayfadan indirmek, saldırgana her iki parçayı da teslim etmek anlamına gelir. GnuPG bu konuda şeffaftır; ilk doğrulama işleminde Good signature ile birlikte WARNING: This key is not certified with a trusted signature! çıktısını verir. Good signature, matematiksel doğruluğun sağlandığı anlamına gelir. Ancak bu, anahtarın aklınızdaki projeye ait olduğu anlamına gelmez. Parmak izini, farklı bir alan adındaki proje dokümantasyonu veya anahtarı halihazırda içeren bir dağıtım paketi gibi ikinci bir kaynaktan alın ve son sekiz karakter yerine parmak izinin tamamını karşılaştırın. Bu, bir SSH özel anahtarının hak ettiği özenin aynısını gerektirir; çünkü anahtar, güven kararının temelidir ve sonraki tüm süreçler bu kararı miras alır.
Tekrarlanabilir derlemeler (reproducible builds), bu fikri bir adım öteye taşır. Yayınlanmış bir özet, sizi hâlâ tek bir makinede oluşturulmuş bir ikili dosyaya bağlar. Bir projenin derlemesi tekrarlanabilir olduğunda, herkes aynı kaynak kodunu derleyebilir ve bayt düzeyinde aynı çıktıyı elde edebilir. Böylece bağımsız derleyiciler, tek bir sunucunun beyanına güvenmek yerine yayınlanan özeti doğrulayabilir. Kodun giderek daha büyük bir kısmının otomatik hatlar ve makine tarafından yazılan yamalar aracılığıyla geldiği günümüzde, bu durum her geçen yıl daha fazla önem kazanmaktadır. Bir derlemeye nelerin dahil edileceğine karar vermek bir politika meselesidir ve yapay zeka destekli kodlar için açık kaynak politikaları, aynı tedarik zinciri üzerinde diğer uçtan çalışır.
Paket yöneticiniz bunu zaten sizin yerinize yapıyor
Debian ve Ubuntu üzerinde apt, her kurulumda bu zinciri otomatik olarak çalıştırır. Paket dizini, her .deb dosyası için bir SHA-256 özeti taşır. Release dosyası bu dizin dosyalarının özetlerini içerir; InRelease ise Release üzerinde bir imza taşır ve bu imza /usr/share/keyrings ile /etc/apt/trusted.gpg.d içindeki anahtarlarla doğrulanır. Zincir koptuğunda apt bunu bildirir: Üçüncü taraf bir deponun anahtarı eksik olduğunda The following signatures couldn't be verified because the public key is not available: NO_PUBKEY hatası, veya çektiğiniz dizin imzalı Release ile eşleşmediğinde Hash Sum mismatch hatası alınır. Bu durum genellikle bir önbellekleme proxy'sinin güncel olmayan bir dosya sunmasından veya yansıma sunucusunun eşitleme sırasında yakalanmasından kaynaklanır.
Bir projenin ana sayfası size curl adresindeki bir betiği doğrudan bir kabuğa yönlendirmenizi (pipe) söylediğinde, ölçü almanız gereken standart budur. Hiçbir şey baytları doğrulamaz ve onları asla görmezsiniz. Sunucu, bir betiğe farklı, bir tarayıcıya farklı bir içerik döndürebilir ve sonrasında inceleyebileceğiniz bir kopyanız olmaz. curl -fsSL <url> -o install.sh ile bir dosyaya indirin, özetini (hash) alın, less ile okuyun ve ancak o zaman çalıştırın. Bu alışkanlık yaklaşık yirmi saniyenizi alır ve kutuya başka hiçbir şey kurulmadan önce, yeni bir VPS'in ilk on dakikasında edinmeye değer aynı alışkanlıktır.
Elle kurduğunuz dosyaların özet listesini tutun
apt ile kurulan paketler sistem tarafından takip edilir. /usr/local/bin dizinine kopyaladığınız bir ikili dosya takip edilmez ve sistemde onu izleyen hiçbir mekanizma yoktur. Bir özet listesi, bu dosyaları dilediğiniz zaman denetleyebileceğiniz bir yapıya dönüştürür:
printf 'a second file\n' > notes.txt
sha256sum *.txt > inventory.sha256
sha256sum -c --quiet inventory.sha256--quiet, tüm dosyalar eşleştiğinde hiçbir çıktı vermez; yalnızca eşleşmeyen satırları yazdırır. Bu nedenle sessizlik başarılı bir kontrol anlamına gelir ve echo $?, 0 bayrağı ile bunu doğrular. Zamanlanmış bir görevde kullanılması gereken biçim budur. --status daha ileri giderek hiçbir çıktı vermez ve size yalnızca çıkış durumunu bırakır. Aynı kalıbı gerçek dosyalar üzerinde sha256sum /usr/local/bin/* > ~/local-bin.sha256 ile kullanırsanız bir temel (baseline) oluşturmuş olursunuz. Yollar, listeye tam olarak yazdığınız şekilde kaydedilir; bu nedenle mutlak yollar kullanmak, kontrolün her dizinden çalışmasını sağlar.
Bu temel değerin ne anlama geldiği konusunda net olun. Bu yöntem, değiştirilmiş bir dosyayı tespit eder. Ancak zaten root yetkisine sahip bir saldırganı tespit edemez; çünkü saldırgan inventory.sha256 dosyasını, ikili dosyayı değiştirdiği kadar kolay bir şekilde yeniden yazabilir. Listenin bir anlam ifade etmesini istiyorsanız, onu sunucu dışında tutun. Bu durum, bir VPS'in ne kadarına gerçekten güveniyorsunuz sorusunun ve disk katmanına başka kimlerin erişebileceği konusunun bir parçasıdır.
FAQ
Eşleşen bir sağlama toplamı (checksum), indirmenin güvenli olduğu anlamına mı gelir?
Hayır. Bu, elinizdeki baytların karşılaştırdığınız özet (digest) ile eşleştiği anlamına gelir. Eğer saldırgan özeti yayınlayan sayfayı kontrol ediyorsa, kendi dosyasının özetini yayınlar ve kontrol işleminiz OK çıktısını verir. Eşleşme, bir tutarlılık iddiasıdır. Güvenlik iddiası, farklı bir kaynaktan edindiğiniz bir anahtarla doğrulanmış bir imza gerektirir; özet, ancak bu durumda o güveni devralır.
sha256sum -c neden FAILED open or read çıktısını veriyor?
Çünkü dosyayı hiç okumadı. Hemen üzerindeki ayrı bir satırda, aradığı isimle birlikte No such file or directory yazar. SHA256SUMS dosyası içindeki isimler, komutu çalıştırdığınız dizine göre belirlenir; bu nedenle indirilen dosyanın bulunduğu dizine geçin ve komutu tekrar çalıştırın. Eğer liste indirmediğiniz dosyaları da içeriyorsa, --ignore-missing ekleyin. open or read içermeyen düz bir FAILED, tam tersi bir durumu ifade eder: dosya okunmuştur ancak özeti eşleşmemiştir.
MD5, bir indirmenin doğrulanması için yeterli midir?
Kazara oluşan hasarlar için evet. Kesintiye uğramış bir aktarım veya hatalı bir disk bloğu, tesadüfen eşleşen bir MD5 özeti üretmez. Bir saldırgana karşı ise hayır. Aynı MD5 özetine sahip iki farklı dosya 2004 yılından beri oluşturulabilmektedir ve SHA-1, 2020 yılında seçilmiş önek çakışmasına (chosen-prefix collision) yenik düşmüştür. Bir proje her ikisini de yayınlıyorsa SHA-256 satırını dikkate alın; sadece MD5 sunan bir proje, eski bir sürüm sürecinin işaretidir.
sha256sum -c ile gpg --verify arasındaki fark nedir?
sha256sum -c, bir dosyanın özetle eşleştiğini kanıtlar. gpg --verify, bir özet dosyasının belirli bir özel anahtarın sahibi tarafından imzalandığını kanıtlar. Farklı sorulara yanıt verdikleri için, bir proje her ikisini de sunuyorsa her ikisini de çalıştırın. İmza, özet listesini güvenilir kılar; özet listesi de indirilen dosyayı güvenilir kılar.
Bir web sayfasında yazan özet ile tek bir dosyayı nasıl kontrol ederim?
Karakterleri gözle karşılaştırmayın. Özeti ve dosya adını, aralarında iki boşluk olacak şekilde tek bir satıra kaydedin, ardından sha256sum -c komutunu bu dosyaya karşı çalıştırın ve verdiği OK veya FAILED çıktısını okuyun. Satırı printf '%s %s\n' ile oluşturmak, sha256sum komutunun dosyayı no properly formatted checksum lines found hatasıyla reddetmesine neden olan biçimlendirme hatalarını önler.