Verifikasi Unduhan Linux dengan sha256sum
Pelajari sha256sum untuk membuat hash, mencocokkannya dengan SHA256SUMS, lalu ubah satu byte dan lihat kegagalan verifikasi secara langsung.
Verifikasi unduhan dengan checksum dalam dua menit
Untuk memverifikasi unduhan dengan checksum, buat hash dari file yang Anda terima, lalu biarkan sebuah alat membandingkan hash tersebut dengan hash yang dicantumkan oleh penerbit. sha256sum melakukan kedua bagian tersebut: tanpa argumen tambahan, perintah ini menampilkan digest, sedangkan dengan -c, perintah ini membaca daftar digest dan melaporkan file yang cocok. Panduan ini menjalankan seluruh proses pada file yang Anda buat, lalu sengaja merusak file tersebut agar Anda dapat melihat kegagalannya secara langsung, bukan hanya membacanya.
Ingat satu hal sepanjang panduan ini. Checksum menunjukkan apakah byte yang Anda miliki sama dengan byte yang menghasilkan digest tersebut. Checksum tidak memberi tahu siapa yang menghasilkan digest itu. Pertanyaan kedua memerlukan signature dan key yang Anda percayai. Bagian terakhir panduan ini menunjukkan dengan tepat batas antara keduanya.
Buat file untuk latihan
Gunakan direktori sementara agar tidak ada perintah di sini yang memengaruhi bagian lain dari sistem. Semua perintah di bawah berasal dari GNU coreutils, yaitu kumpulan perintah dasar yang tersedia di setiap server Ubuntu atau Debian. Jadi, tidak ada yang perlu diinstal.
mkdir -p ~/checksum-demo
cd ~/checksum-demo
printf 'the payload of a totally ordinary download\n' > payload.txt
sha256sum payload.txtAnda akan mendapatkan satu baris: 64 karakter heksadesimal, dua spasi, lalu nama file. Ke-64 karakter tersebut adalah digest file. Jalankan perintah itu lagi. Hasilnya tetap identik karena hashing bersifat deterministik: input yang sama selalu menghasilkan output yang sama. Ubah satu karakter dalam file, lalu jalankan perintah itu lagi. Digest tidak hanya berubah sedikit. Hasilnya tampak sama sekali berbeda karena perubahan satu bit input membalik sekitar setengah bit output. Sifat ini membuat string sepanjang 64 karakter dapat digunakan sebagai pengganti untuk image berukuran 4 GB.
Simpan file SHA256SUMS, lalu periksa
Digest yang tampil di layar tidak berguna sehari kemudian. Tulis digest tersebut ke file dalam format yang dihasilkan oleh sha256sum, agar tool dapat membacanya kembali nanti.
sha256sum payload.txt > SHA256SUMS
cat SHA256SUMS
sha256sum -c SHA256SUMSsha256sum -c membaca setiap baris dalam daftar, membuat hash dari file yang tercantum pada baris tersebut, lalu membandingkan kedua digest. Eksekusi yang berhasil menampilkan satu baris untuk setiap file:
payload.txt: OKPeriksa juga exit status, karena script membaca nilai tersebut dan tidak membaca teksnya. echo $? menampilkan 0 setelah eksekusi berhasil. Nama SHA256SUMS merupakan konvensi, bukan aturan, tetapi distribusi dan sebagian besar halaman rilis menggunakannya. Gunakan nama tersebut agar orang berikutnya mengetahui isi file tanpa harus membukanya.
Balik satu byte dan amati pemeriksaan gagal
Sekarang rusak file tersebut dengan sengaja. Perintah ini menulis satu byte pada offset 5 dan membiarkan bagian lainnya tetap utuh, sehingga panjang dan nama file tetap sama.
printf 'X' | dd of=payload.txt bs=1 seek=5 conv=notrunc status=none
cat payload.txt
sha256sum -c SHA256SUMSconv=notrunc adalah flag yang penting: tanpa flag ini, dd memotong file pada titik ketika proses penulisan berhenti, sehingga Anda akan menguji jenis kerusakan yang jauh lebih jelas. Pemeriksaan sekarang menampilkan:
payload.txt: FAILED
sha256sum: WARNING: 1 computed checksum did NOT matchecho $? menampilkan 1. FAILED berarti file telah dibaca, tetapi digest-nya tidak cocok dengan digest dalam daftar. Kembalikan byte asli, lalu pastikan pemeriksaan kembali menampilkan OK:
printf 'the payload of a totally ordinary download\n' > payload.txt
sha256sum -c SHA256SUMSItulah keseluruhan kebiasaannya. Perbedaan satu byte saja, di mana pun letaknya dalam file, menghasilkan FAILED. Unduhan yang terputus karena koneksi terputus, mirror yang menyediakan build kemarin, proxy yang mengubah file saat transit, atau disk yang mengembalikan blok buruk: semuanya akan muncul pada baris yang sama.
Ketika daftar mencantumkan file yang tidak Anda unduh
File SHA256SUMS nyata dari suatu distribusi mencantumkan setiap image yang dirilis proyek tersebut, dan Anda mengunduh salah satunya. Tiru situasi tersebut di sini.
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 adalah kegagalan yang berbeda dari FAILED, dan mencampuradukkan keduanya hanya membuang waktu. FAILED berarti byte-nya salah. FAILED open or read berarti sha256sum sama sekali tidak menemukan file tersebut, sehingga tidak ada yang dibandingkan. Pada pengunduhan nyata, penyebab yang biasanya terjadi adalah working directory, karena nama dalam daftar bersifat relatif terhadap lokasi saat Anda menjalankan perintah. Pindah ke direktori yang berisi file tersebut, lalu jalankan kembali perintahnya. Untuk memeriksa hanya file yang benar-benar Anda miliki, gunakan perintah berikut:
sha256sum --ignore-missing -c SHA256SUMS.allPerintah tersebut mencetak payload.txt: OK dan keluar dengan status 0. Jika tidak ada nama yang tercantum yang tersedia, --ignore-missing tidak akan berhasil secara diam-diam ketika tidak ada file yang diperiksa. Perintah tersebut melaporkan no file was verified dan keluar dengan status non-zero. Inilah perilaku yang diinginkan, karena pemeriksaan yang berhasil tanpa memeriksa apa pun adalah kegagalan yang tidak akan Anda sadari.
Tempelkan digest yang dipublikasikan tanpa membacanya secara manual
Membandingkan 64 karakter heksadesimal secara manual adalah saat kebiasaan ini benar-benar bermasalah. Orang memeriksa empat karakter pertama dan empat karakter terakhir, lalu menganggapnya cocok. Perbandingan seperti itulah yang diandalkan oleh penyerang yang memiliki persiapan. Biarkan tool yang membandingkannya. Atur EXPECTED ke digest yang Anda salin dari penerbit. Gunakan EXPECTED= diikuti nilai yang ditempelkan, lalu buat satu baris yang diharapkan oleh -c:
printf '%s %s\n' "$EXPECTED" payload.txt > payload.sha256
cat payload.sha256
sha256sum -c payload.sha256Terdapat dua spasi antara digest dan nama file. Karena itu, string format tersebut memuat dua spasi. Itulah format yang ditulis oleh sha256sum dan dibaca oleh -c. File yang hanya berisi digest bukan baris checksum. Karena itu, pemeriksaan menolak seluruh file dengan no properly formatted checksum lines found, bukan menebak file yang Anda maksud. Beberapa proyek menerbitkan format berlabel BSD, yaitu SHA256 (payload.txt) = diikuti digest. GNU coreutils menulis format tersebut dengan sha256sum --tag payload.txt dan membacanya kembali dengan -c. Jadi, kedua format tersebut dapat disimpan.
Jika pemeriksaan berjalan tidak semestinya, periksa isi daftar itu dengan cat -A SHA256SUMS. Perintah ini menandai akhir setiap baris dengan $ dan menampilkan karakter yang biasanya tidak terlihat. Baris yang diakhiri ^M$ memperoleh carriage return dari editor Windows. GNU sha256sum mengabaikan karakter tambahan tersebut dan tetap menampilkan OK. Jadi, daftar CRLF bukan penyebab pemeriksaan gagal, meskipun tool di luar coreutils kurang toleran terhadapnya. Normalkan salinan yang Anda simpan dengan tr -d '\r' < SHA256SUMS > SHA256SUMS.clean.
Apa yang dibuktikan checksum, dan apa yang tidak?
Checksum membuktikan satu hal: byte pada disk Anda sama dengan byte yang menghasilkan digest yang dipublikasikan. Ini sepenuhnya mencakup kerusakan yang tidak disengaja. Ini juga mencakup penyerang yang ceroboh, yang mengganti file pada mirror unduhan tetapi tidak dapat mengubah halaman tempat digest dipublikasikan.
Checksum tidak membuktikan siapa pembuatnya. Digest adalah fakta tentang byte, bukan fakta tentang manusia. Jika satu halaman menyediakan file dan digest sekaligus, siapa pun yang dapat mengubah salah satunya dapat mengubah yang lain. Dalam kondisi itu, baris OK Anda hanya berarti mirror tersebut cocok dengan dirinya sendiri. Jadi, berikut aturan yang membuat checksum layak digunakan: ambil digest dari lokasi yang berbeda dari lokasi pengambilan file. Misalnya, ambil digest dari domain milik proyek melalui TLS (transport layer security), sementara image diambil dari mirror atau torrent. Dengan demikian, penyerang harus mengendalikan dua lokasi, bukan satu.
Algoritmanya juga penting. SHA-256 (secure hash algorithm, output 256-bit) tidak memiliki collision yang diketahui hingga August 2026. Karena itu, penerbit menggunakannya. MD5 (message digest 5) dan SHA-1 tidak lagi dapat diandalkan: dua file berbeda dengan digest MD5 yang sama telah dapat dibuat sejak 2004, dan collision SHA-1 dengan chosen-prefix dipublikasikan pada 2020. File MD5SUMS tetap dapat mendeteksi unduhan yang terpotong karena kerusakan acak bukanlah collision yang dibuat secara sengaja. Namun, file tersebut tidak dapat menghentikan seseorang yang berusaha menipu Anda. Jika sebuah proyek memublikasikan keduanya, gunakan baris SHA-256.
Saat tanda tangan digital mengambil alih
Tanda tangan digital menutup celah yang masih ditinggalkan oleh digest. Publisher menandatangani file digest dengan private key, lalu Anda memverifikasinya dengan public key mereka: gpg --verify SHA256SUMS.asc SHA256SUMS. Jika verifikasi berhasil, daftar digest tersebut berasal dari pihak yang memegang key itu. Kemudian sha256sum -c SHA256SUMS mengaitkan file pada disk Anda dengan daftar tersebut, sehingga rantainya terbentang dari key hingga byte.
Titik lemahnya berpindah ke key. Jika Anda mengambil key dari halaman yang sama dengan halaman penyedia file, penyerang akan memperoleh kedua bagian tersebut. GnuPG menyatakan hal ini dengan jelas, dan verifikasi pertama akan menampilkan Good signature beserta WARNING: This key is not certified with a trusted signature!. Good signature berarti perhitungannya valid. Hal itu tidak berarti key tersebut benar-benar milik project yang Anda maksud. Dapatkan fingerprint dari sumber kedua, seperti dokumentasi project pada domain lain atau package distribusi yang sudah menyertakan key tersebut, lalu bandingkan fingerprint lengkapnya, bukan hanya delapan karakter terakhir. Ini adalah kehati-hatian yang sama seperti pada private key SSH, karena alasannya sama: key tersebut menentukan kepercayaan, dan semua bagian setelahnya mewarisi kepercayaan itu.
Reproducible build mendorong gagasan ini selangkah lebih jauh. Digest yang dipublikasikan tetap mengikat Anda pada binary yang dibuat oleh satu mesin. Jika build sebuah project bersifat reproducible, siapa pun dapat mengompilasi source yang sama dan menghasilkan output yang identik hingga tingkat byte. Dengan demikian, builder independen dapat mengonfirmasi digest yang dipublikasikan, bukan meminta Anda mempercayai satu server. Hal ini semakin penting setiap tahun karena semakin banyak code masuk melalui pipeline otomatis dan patch yang ditulis mesin. Menentukan hal yang boleh Anda masukkan ke dalam build merupakan pertanyaan kebijakan, dan kebijakan open source untuk code yang dibantu AI menangani supply chain yang sama dari sisi lainnya.
Manajer paket Anda sudah melakukan ini untuk Anda
Pada Debian dan Ubuntu, apt menjalankan rangkaian ini pada setiap instalasi tanpa diminta. Indeks paket menyimpan digest SHA-256 untuk setiap berkas .deb. Berkas Release menyimpan digest berkas indeks tersebut, sedangkan InRelease menyimpan tanda tangan atas Release. Tanda tangan ini diverifikasi terhadap kunci dalam /usr/share/keyrings dan /etc/apt/trusted.gpg.d. Jika rantai verifikasi terputus, apt akan menyatakannya: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY ketika kunci repositori pihak ketiga tidak ada, atau Hash Sum mismatch ketika indeks yang Anda ambil tidak cocok dengan Release yang ditandatangani. Biasanya, hal ini berarti proxy caching menyajikan berkas lama atau Anda mendapatkan mirror saat sedang melakukan sinkronisasi.
Gunakan ini sebagai standar pembanding ketika halaman beranda suatu proyek meminta Anda menyalurkan skrip dari curl langsung ke shell. Tidak ada yang memverifikasi byte tersebut dan Anda tidak pernah melihat isinya. Server juga dapat mengembalikan satu isi kepada skrip dan isi lain kepada browser. Selain itu, Anda tidak memiliki salinan untuk diperiksa setelahnya. Unduh skrip ke berkas dengan curl -fsSL <url> -o install.sh, hitung hash-nya, baca dengan less, lalu jalankan hanya setelah itu. Kebiasaan ini memerlukan waktu sekitar dua puluh detik. Ini juga kebiasaan yang sebaiknya mulai diterapkan pada VPS baru dalam sepuluh menit pertama, sebelum memasang apa pun pada server tersebut.
Simpan daftar digest untuk setiap instalasi manual
Paket yang diinstal oleh apt akan dilacak. Biner yang Anda salin ke /usr/local/bin tidak dilacak, dan tidak ada proses pada sistem yang memantaunya. Daftar digest memungkinkan Anda memeriksanya sesuai kebutuhan:
printf 'a second file\n' > notes.txt
sha256sum *.txt > inventory.sha256
sha256sum -c --quiet inventory.sha256--quiet tidak menampilkan apa pun jika semua file cocok. Jika ada file yang tidak cocok, perintah ini hanya menampilkan baris yang gagal. Jadi, keluaran kosong berarti pemeriksaan berhasil, dan echo $? mengonfirmasinya dengan 0. Gunakan bentuk ini dalam tugas terjadwal. --status melangkah lebih jauh dengan tidak menampilkan keluaran sama sekali. Anda hanya mendapatkan status keluar. Terapkan pola yang sama pada file sebenarnya dengan sha256sum /usr/local/bin/* > ~/local-bin.sha256 untuk membuat baseline. Path disimpan dalam daftar persis seperti saat Anda mengetikkannya. Karena itu, path absolut membuat pemeriksaan dapat dijalankan dari direktori mana pun.
Pahami dengan jelas nilai baseline tersebut. Baseline mendeteksi file yang berubah. Baseline tidak mendeteksi penyerang yang sudah memiliki akses root, karena penyerang tersebut dapat menulis ulang inventory.sha256 dengan mudah, sama seperti saat menulis ulang biner. Simpan daftar tersebut di luar mesin jika Anda ingin hasilnya tetap bermakna. Hal ini merupakan bagian dari pertanyaan yang lebih luas tentang seberapa besar Anda benar-benar mempercayai VPS dan siapa lagi yang dapat mengakses disk di bawahnya.
FAQ
Apakah checksum yang cocok berarti unduhan aman?
Tidak. Artinya byte yang Anda miliki cocok dengan digest yang menjadi pembanding. Jika penyerang mengendalikan halaman yang menerbitkan digest tersebut, mereka dapat menerbitkan digest untuk file mereka sendiri, dan pemeriksaan Anda akan menampilkan OK. Kecocokan hanya menyatakan konsistensi. Pernyataan keamanan memerlukan tanda tangan yang diverifikasi terhadap key yang Anda peroleh dari sumber berbeda. Setelah itu, digest tersebut mewarisi kepercayaan dari key itu.
Mengapa sha256sum -c menampilkan FAILED open or read?
Karena perintah tersebut tidak pernah membaca file. Baris terpisah tepat di atasnya menyatakan No such file or directory beserta nama file yang dicari. Nama file dalam file SHA256SUMS bersifat relatif terhadap direktori tempat Anda menjalankan perintah. Karena itu, pindah ke direktori yang berisi unduhan, lalu jalankan kembali perintah tersebut. Jika daftar itu juga mencantumkan file yang tidak Anda unduh, tambahkan --ignore-missing. FAILED biasa tanpa open or read menunjukkan situasi sebaliknya: file telah dibaca, tetapi digest-nya tidak cocok.
Apakah MD5 cukup untuk memverifikasi unduhan?
Untuk mendeteksi kerusakan yang tidak disengaja, ya. Transfer yang terpotong atau blok disk yang rusak tidak akan secara kebetulan menghasilkan digest MD5 yang cocok. Untuk menghadapi penyerang, tidak. Dua file berbeda dengan digest MD5 yang sama telah dapat dibuat sejak 2004, dan SHA-1 berhasil diserang dengan collision chosen-prefix pada 2020. Gunakan baris SHA-256 jika proyek menerbitkan keduanya. Anggap proyek yang hanya menyediakan MD5 sebagai tanda bahwa proses rilisnya sudah lama.
Apa perbedaan antara sha256sum -c dan gpg --verify?
sha256sum -c membuktikan bahwa file cocok dengan suatu digest. gpg --verify membuktikan bahwa file digest ditandatangani oleh pemegang private key tertentu. Keduanya menjawab pertanyaan yang berbeda. Karena itu, jalankan keduanya jika proyek menyediakan keduanya. Tanda tangan membuat daftar digest dapat dipercaya. Daftar digest tersebut kemudian membuat file yang diunduh dapat dipercaya.
Bagaimana cara memeriksa satu file terhadap digest yang ditampilkan pada halaman web?
Jangan membandingkan karakternya secara manual. Simpan digest dan nama file pada satu baris, dengan dua spasi sebagai pemisah. Kemudian, jalankan sha256sum -c terhadap file tersebut dan baca OK atau FAILED yang ditampilkannya. Membuat baris tersebut dengan printf '%s %s\n' mencegah kesalahan pemformatan yang dapat membuat sha256sum menolak file dengan no properly formatted checksum lines found.