Linux'ta sha256sum ile dosya bütünlüğü nasıl doğrulanır?
Linux sistemlerde sha256sum komutunu kullanarak indirilen dosyaların doğruluğunu test edin. Hatalı bir baytın sağlama toplamını nasıl bozduğunu uygulamalı görün.
Bir indirme işlemini sağlama toplamı ile iki dakikada doğrulama
Bir indirme işlemini sağlama toplamı (checksum) ile doğrulamak için, elinizdeki dosyanın özetini (hash) alın ve bir aracın bu özeti, yayıncının belirttiği değerle karşılaştırmasını sağlayın. sha256sum bu işlemin her iki aşamasını da gerçekleştirir: tek başına kullanıldığında bir özet değeri üretir, -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 döngüyü çalıştırır, ardından hatanın nasıl gerçekleştiğini okumak yerine bizzat 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 üreten 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.
Üzerinde çalışılacak 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 olan GNU coreutils paketinden gelir; 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. Dosyanın bir karakterini değiştirip tekrar çalıştırdığınızda, özet küçük bir değişim göstermez. Tamamen farklı görünür, çünkü girdideki 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 işlevsiz kalır. Bu değeri, sha256sum aracının kendi çıktı formatında bir dosyaya yazın; 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 özetini hesaplar ve iki özet değerini karşılaştırır. Sorunsuz bir işlem, her dosya için bir satır çıktı verir:
payload.txt: OKÇıkış durumunu da kontrol edin; çünkü bir betik metni değil, bu durumu okur. echo $?, temiz 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ı bunu kullandığı için siz de aynısını 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. offset konumuna 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ğunu ancak özet değerinin listedekiyle eşleşmediğini ifade eder. 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. Kesilen bir bağlantı nedeniyle yarım kalan indirme, eski bir sürümü sunan yansıma sunucusu, dosyayı iletim sırasında yeniden yazan bir proxy veya hatalı blok döndüren bir disk: hepsi aynı satırda sonuçlanır.
İndirmediğiniz bir dosya listede yer aldığında
Bir dağıtıma ait gerçek bir SHA256SUMS dosyası, projenin sunduğu her bir imajı listeler ancak siz bunlardan yalnızca birini indirmişsinizdir. 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 aynı hata değildir; ikisini birbirine 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ç indirilmediğ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örecelidir. Dosyanın bulunduğu dizine geçiş yapın 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 sonlanır. 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 rapor verir ve sıfırdan farklı bir kodla sonlanır; bu, istenen davranıştır çünkü hiçbir şeyi kontrol etmeyen bir başarı, fark edemeyeceğiniz bir hata türüdür.
Özet veriyi gözle kontrol etmeden yapıştırın
64 karakterlik onaltılık (hexadecimal) bir özeti gözle karşılaştırmak, bu alışkanlığın en zayıf noktasıdır. Kullanıcılar genellikle ilk dört ve son dört karaktere bakıp eşleştiğine karar verir; kararlı bir saldırganın hedeflediği karşılaştırma yöntemi tam olarak budur. 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 kullanın, sonrasında -c aracının beklediği tek satırlık komutu 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 verisini içeren bir dosya, geçerli 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 özetin geldiği 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 saklanabilir.
Bir kontrol işlemi beklenmedik şekilde davranıyorsa, cat -A SHA256SUMS komutuyla listenin kendisine bakın. 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 gelen bir satır başı (carriage return) karakteri içeriyor demektir. GNU sha256sum bu sondaki karakteri görmezden gelir ve yine de OK çıktısını verir; yani CRLF biçimli bir liste kontrolünüzü bozmaz. Ancak coreutils dışındaki araçlar bu konuda daha az toleranslıdır. Sakladığınız kopyayı tr -d '\r' < SHA256SUMS > SHA256SUMS.clean ile normalleştirin.
Checksum neyi kanıtlar, neyi kanıtlamaz?
Bir checksum tek bir şeyi kanıtlar: diskinizdeki baytlar, yayınlanan özeti (digest) oluşturan baytlarla aynıdır. Bu, kazara oluşan veri bozulmalarını tamamen kapsar. Ayrıca, dosyayı bir indirme yansımasında (mirror) değiştiren ancak özeti yayınlayan sayfaya erişemeyen dikkatsiz bir saldırgana karşı da koruma sağlar.
Yazarlık konusunda hiçbir şey kanıtlamaz. Ö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 sadece yansımanın kendi içinde tutarlı olduğunu gösterir. Checksum kullanmayı anlamlı 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, özeti projenin kendi alan adından TLS (transport layer security) üzerinden temin edin. Bu durumda bir saldırganın tek bir yeri değil, iki farklı yeri kontrol etmesi gerekir. Ayrıca, bu doğrulanmış baytların çalıştırıldığında ne yapacağı hakkında da hiçbir şey söylemez; bu, bir kurulum betiğinden agent yetkilerinizle çalışan bir dsh eklentisine kadar, sizin adınıza yürütülen her şey için sorulması gereken ayrı bir sorudur.
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üvenli 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ı, rastgele bozulmalar kasıtlı bir çakışma olmadığından, eksik inen bir dosyayı hala tespit edebilir. Ancak sizi kandırmaya çalışan birine karşı duramaz. Bir proje her ikisini de yayınlıyorsa, SHA-256 satırını esas alın.
İmzaların devreye girdiği yer
İ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 tutan kişiden geldiği kesinleşir. Ardından sha256sum -c SHA256SUMS, diskinizdeki dosyayı listeye bağlar ve zincir, anahtardan dosya baytlarına kadar uzanır.
Zayıf nokta anahtara kayar. Anahtarı, dosyayı sunan sayfadan indirmek, her iki parçayı da saldırgana teslim etmek anlamına gelir. GnuPG bu konuda şeffaftır; ilk doğrulama işlemi 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 hedeflediğiniz projeye ait olduğu anlamına gelmez. Parmak izini, farklı bir alan adındaki proje belgeleri 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 hala tek bir makinenin oluşturduğu 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 fazlasının otomatik hatlar ve makine tarafından yazılan yamalarla 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 zincirini diğer uçtan ele alır.
Paket yöneticiniz bunu sizin yerinize zaten 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 içerir. Release dosyası bu dizin dosyalarının özetlerini taşır; InRelease ise Release üzerinde bir imza barındırır ve bu imza /usr/share/keyrings ile /etc/apt/trusted.gpg.d içindeki anahtarlara göre 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 bir yansıma sunucusunun (mirror) eşitleme sırasında yakalanmasından kaynaklanır.
Bir projenin ana sayfası size curl adresindeki bir betiği doğrudan bir kabuğa (shell) yönlendirmenizi 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ı, 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; ancak yeni bir VPS'in ilk on dakikasında, sunucuya başka hiçbir şey kurulmadan önce edinilmesi gereken alışkanlığın aynısıdır.
Elle kurduğunuz dosyalar için özet listesi tutun
apt ile kurulan paketler takip edilir. /usr/local/bin dizinine kopyaladığınız bir binary dosyası takip edilmez ve sistemde onu izleyen hiçbir mekanizma yoktur. Bir özet (digest) listesi, bu dosyayı talep üzerine kontrol edilebilir bir hale getirir:
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 $? bunu 0 ile 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ı sha256sum /usr/local/bin/* > ~/local-bin.sha256 ile gerçek dosyalara yönlendirirseniz bir temel (baseline) oluşturmuş olursunuz. Yollar, listeye tam olarak yazdığınız şekilde kaydedilir; bu nedenle mutlak yollar (absolute paths) kullanmak, kontrolün herhangi bir 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 root yetkisine zaten sahip olan bir saldırganı tespit edemez; çünkü saldırgan inventory.sha256 dosyasını, binary dosyasını değiştirdiği kadar kolay bir şekilde yeniden yazabilir. Listenin bir anlam ifade etmesini istiyorsanız, onu makinenin dışında tutun. Bu durum, bir VPS'in ne kadarına gerçekten güvendiğiniz ve diske başka kimlerin erişebileceği ile ilgili daha geniş kapsamlı sorunun 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 üzerinde yer alan 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 görelidir; bu yüzden 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 ise 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, şans eseri 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 ise eski bir sürüm sürecine işaret eder.
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 ikisini de çalıştırın. İmza, özet listesini güvenilir kılar; özet listesi ise 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 o dosya üzerinde sha256sum -c komutunu çalıştırın ve verdiği OK veya FAILED çıktısını okuyun. Satırı printf '%s %s\n' ile oluşturmak, sha256sum aracının dosyayı no properly formatted checksum lines found hatasıyla reddetmesine neden olan biçimlendirme hatalarını önler.