Bagaimana cara saya menghasilkan dan memvalidasi checksum file secara efisien?

12

Saya ingin dapat menangkap dan memvalidasi checksum untuk koleksi file skala besar, biasanya bersarang dalam hierarki direktori yang kompleks.

Apakah setiap file memerlukan checksum? Apakah ada cara untuk meningkatkan struktur direktori yang ada, katakanlah, memvalidasi hanya sebuah simpul di pohon file dan belum tentu setiap file di dalamnya?

Aaron Rubinstein
sumber
Seperti yang dicatat oleh jawaban, penting untuk membedakan jenis ancaman yang Anda mitigasi dan checksum yang sesuai. Jawaban Stack Overflow Perpustakaan dan Informasi sebelumnya yang saya berikan mungkin menarik, meskipun sebagian besar tentang HDFS.
Andy Jackson

Jawaban:

13

Cara paling efisien untuk menggunakan checksum adalah membuat komputer melakukan semuanya. Gunakan sistem file seperti ZFS yang checksum (sebenarnya menggunakan hash, yang lebih kuat dari checksum) semua data saat ini ditulis, dan verifikasi setiap kali data dibaca. Tentu saja, downside adalah bahwa ZFS tidak tahu kapan menghapus atau menimpa file adalah kesalahan dan ketika itu operasi normal, tetapi karena ZFS menggunakan semantik copy-on-write untuk semuanya, Anda dapat menggunakan fitur snapshotting untuk mengurangi risiko .

ZFS juga dapat secara otomatis mengembalikan data yang gagal pada pemeriksaan hash dengan menggunakan redundansi apa pun yang telah Anda atur, apakah paritas gaya raid5, mirror drive atau salinan duplikat (tambahkan properti copy = N ke sistem file ZFS mana pun dan akan menyimpan N salinan dari setiap data yang Anda tulis). Ini juga menyimpan hash di pohon Merkle, di mana nilai hash file tergantung pada hash dari blok, hash dari entri direktori tergantung pada nilai hash dari file dan direktori yang dikandungnya, hash dari filesystem tergantung pada hash direktori root, dll.

Terlepas dari solusi apa yang Anda dapatkan, Anda akan selalu menemukan bahwa prosesnya dibatasi oleh kecepatan disk Anda, bukan oleh kecepatan CPU Anda.

Juga, jangan lupa untuk memperhitungkan BER dari disk Anda. Bagaimanapun, mereka hanyalah piring-piring karat yang berputar. Drive tingkat konsumen memiliki tingkat kesalahan 1 bit yang salah dibaca untuk setiap 10 ^ 14 bit yang dibaca, yang berarti 1 bit dari setiap 11 terabyte yang Anda baca. Jika Anda memiliki kumpulan data 11 terabyte dan Anda menghitung hash dari setiap file di dalamnya, Anda akan menghitung salah satu checksum itu secara tidak benar dan secara permanen merusak satu blok dari salah satu file dalam kumpulan data. ZFS, bagaimanapun, tahu hash dari setiap blok yang ditulisnya ke setiap disk di kumpulan Anda, dan karenanya tahu blok mana yang hilang. Kemudian dapat menggunakan redundansi (paritas, cermin atau salinan tambahan) di kumpulan Anda untuk menulis ulang data di blok itu dengan nilai yang benar.

Namun, Ben menyampaikan poin bagus dalam komentar. ZFS tidak memaparkan nilai hash apa pun yang dihitungnya untuk pengguna, sehingga data yang masuk atau meninggalkan sistem ZFS harus disertai dengan hash. Saya suka cara Internet Archive melakukan ini dengan file xml yang menyertai setiap item dalam arsip. Lihat https://ia801605.us.archive.org/13/items/fakebook_the-firehouse-jazz-band-fake-book/fakebook_the-firehouse-jazz-band-fake-book_files.xml sebagai contoh.

db48x
sumber
1
Anda mengalahkan saya untuk itu. Saya juga akan menyarankan sistem berbasis hash. Hash setiap file, hash hash file (+ sub dir hash) untuk hash direktori dll. Trade off adalah CPU / IO vs probabilitas kesalahan. Checksum / CRC murah tetapi probabilitas kesalahan meningkat seiring dengan skala. Begitu juga hash biasa tetapi mereka mulai dengan probabilitas kesalahan yang jauh lebih rendah.
The Diamond Z
3
Sekalipun Anda menjalankan sistem file seperti ZFS (Btrfs juga memiliki fungsionalitas yang serupa, tetapi masih dalam pengembangan yang berat dan belum dianggap siap untuk penggunaan produksi saat ini), Anda perlu melakukan operasi "scrub" secara berkala untuk memastikan data tersebut membaca dan memverifikasi terhadap checksum atau hash. Hanya menghitung checksum dan kemudian tidak melakukan apa pun dengannya sampai Anda membutuhkan akses ke data yang berpotensi lebih buruk daripada tidak berharga.
CVn
1
Ya, itu poin bagus. Gosok terakhir saya memperbaiki 2 kilobyte data yang rusak. Itu empat blok yang tersebar di lima drive! Semakin lama Anda pergi antara membaca sepotong data tertentu, semakin tinggi probabilitas bahwa Anda akan mengumpulkan cukup banyak kesalahan dalam satu file sehingga tidak akan dapat memulihkannya.
1
Menjalankan userspace md5sum lebih dari sekitar 150 GB data pada PC di rumah saya membutuhkan waktu sekitar 40 menit di dinding, murni I / O-terikat. Dengan meningkatkan itu hingga 100 kali lipat, kami mendapatkan 15 TB diperiksa di bawah naungan di bawah tiga hari, pada perangkat keras konsumen. Saya pasti akan mempertimbangkan itu bisa dilakukan bahkan pada arsip besar, dengan interval yang dipilih dengan benar.
CVn
3
ZFS menghitung checksum untuk blok, bukan file atau bitstream, bukan? Sementara ZFS memecahkan masalah komputasi, tampaknya itu kurang dapat diaudit manusia, dan tidak menghasilkan data fixity yang portabel terlepas dari filesystem - sesuatu yang merupakan keharusan untuk arsip.
6

Saya akan menghasilkan checksum untuk setiap file. Checksum sangat kecil, dan menghasilkan checksum untuk seluruh direktori akan mengharuskan Anda untuk memproses setiap file juga (setidaknya jika Anda tidak berbicara tentang checksum direktori, dibuat hanya dari entri direktori - saya akan membuatnya juga, untuk memastikan tidak ada data dihapus).

Asumsikan Anda memiliki satu checksum untuk seluruh arsip. Anda tahu datanya rusak, tetapi Anda tidak tahu apakah ini hanya satu file, dan yang lebih penting, yang mana dari mereka. Memiliki checksum terpisah memberi Anda lebih banyak fleksibilitas. Anda dapat mendeteksi satu file yang rusak, dan menggantinya dari file dari cadangan lain (yang dapat, pada gilirannya, membuat file lain rusak).

Dengan cara itu, data Anda lebih mungkin untuk bertahan.

Pelaut Danubia
sumber
Itu tentu masuk akal. Saya hanya ingin tahu strategi apa yang ada untuk menangani fitur penghitungan dan pengecekan ratusan ribu checksum yang mahal secara komputasi.
4

Mungkin ini saat yang tepat untuk membuka BagIt . Ini adalah format kemasan file yang sangat sederhana namun kuat yang ditujukan untuk pengarsipan, pelestarian jangka panjang, dan transfer objek digital. Pengguna termasuk Library of Congress dan California Digital Library.

Alat BagIt (mereka ada dalam beberapa bahasa pemrograman) menempatkan file Anda ke dalam struktur direktori tertentu dan melakukan checksumming / hashing untuk Anda. Itu semuanya.

PS: Tentu saja, alat-alat BagIt juga dapat memverifikasi tas terhadap checksum / hash yang disertakan, dan Anda dapat menambahkan beberapa metadata ke tas. Tapi itu serumit tas.

Christian Pietsch
sumber
1

Jawaban ini adalah kombinasi dari @ lechlukasz dan @ db48x , juga menggabungkan beberapa poin yang dibuat dalam komentar serta beberapa pemikiran saya sendiri.

Jalur sederhana ke depan adalah sistem file gabungan dan pendekatan metadata terpisah.

Dengan menggunakan sistem file yang melakukan hash dan validasi data sambil jalan, seperti ZFS atau Btrfs (harap dicatat bahwa meskipun kemajuan besar telah dibuat, Btrfs tidak dianggap siap untuk penggunaan produksi saat ini), Anda dapat yakin bahwa jika data dapat dibaca dari disk tanpa kesalahan sistem operasi, maka pembacaan data ditulis ke disk dengan cara yang dimaksudkan oleh sistem file. Dengan menjalankan operasi "scrub" secara berkala, semua data dibaca dan diverifikasi berdasarkan ide sistem file tentang apa yang seharusnya.

Namun, itu hanya melindungi terhadap kerusakan pada disk (blok yang tidak dapat dibaca, kesalahan penulisan perangkat keras secara langsung, penulisan yang tidak valid yang merusak bagian data secara langsung pada perangkat blok, dll.). Itu tidak melindungi terhadap bug perangkat lunak, operasi pengguna yang salah, atau perangkat lunak berbahaya yang bekerja melalui fasilitas sistem operasi yang dimaksudkan untuk bekerja dengan file, dengan asumsi bahwa fasilitas itu bebas dari bug tersebut.

Untuk melindungi dari yang terakhir, Anda membutuhkan lapisan perlindungan lain. Checksumming atau hashing data dari perspektif aplikasi pengguna akan membantu melindungi terhadap banyak risiko yang disebutkan di atas, tetapi perlu dilakukan secara terpisah (baik sebagai tindakan proses bawaan dalam perangkat lunak, atau sebagai proses yang sepenuhnya terpisah).

Dengan perangkat keras masa kini dan apa yang praktis untuk menyimpan data dalam jumlah besar (hard disk piringan berputar sebagai lawan disk solid-state / SSD), bahkan algoritma hashing kompleks seperti SHA1 akan sebagian besar terikat I / O - yaitu, kecepatan di mana data hash akan menjadi fungsi dari kecepatan baca sistem penyimpanan, daripada kemampuan prosesor komputer untuk menghitung hash. Saya melakukan percobaan dengan menjalankan proses hashing MD5 ruang-pengguna lebih dari sekitar 150 GB data pada apa pada tahun 2012 adalah PC konsumen tingkat menengah, dan selesai setelah menjalankan disk pada dasarnya tanpa gangguan selama sekitar 40 menit. Menambah angka-angka itu hingga 100 kali lipat, Anda akan mendapatkan hash MD5 koleksi 15 TB dalam waktu sekitar tiga hari pada perangkat keras yang sama. Dengan menambahkan tingkat transfer baca (yang dapat dengan mudah dicapai misalnyaRAID 0 misalnya adalah striping tanpa redundansi, biasanya digunakan untuk mencapai kinerja baca / tulis yang lebih tinggi mungkin dalam kombinasi dengan RAID 1 membentuk RAID 10 ), waktu penyelesaian dapat diturunkan untuk jumlah data yang sama.

Dengan menggabungkan keduanya, Anda mendapatkan yang terbaik dari kedua dunia: sistem file memberi Anda jaminan bahwa apa yang Anda terima saat membaca file adalah apa yang sebenarnya ditulis, dan proses pengecekan fixity terpisah dapat berjalan di seluruh koleksi memastikan bahwa data disimpan masih cocok dengan apa yang dicerna ke dalam arsip. Setiap ketidakkonsistenan antara keduanya (sistem file mengatakan file tersebut OK, pengecekan fixity mengatakan tidak) akan menunjukkan file yang telah dimodifikasi di luar mode operasi arsip yang dimaksudkan tetapi dari dalam fasilitas sistem operasi, meminta pengembalian dari sekunder salin (cadangan). Dengan demikian pemeriksaan fixity dapat berjalan pada interval waktu yang lebih lama, yang menjadi penting untuk arsip yang sangat besar, tetapi setiap akses online masih dijamin tidak rusak pada perangkat keras jika pembacaan berhasil. Pada prinsipnya, perangkat lunak arsip dapat mengandalkan sistem file untuk melaporkan ketidakkonsistenan sebagai kesalahan baca, dan melakukan pemeriksaan fixity terpisah di latar belakang saat pengguna bekerja dengan file dan menampilkan pesan yang sesuai seandainya menunjukkan bahwa file tidak cocok dengan apa yang dicerna ke dalam arsip. Menggunakan sistem file blok-hashing, skema seperti itu akan memiliki dampak minimal pada kinerja yang dirasakan sambil tetap memberikan jaminan bahwa konten sudah benar.

sebuah CVn
sumber
1

Saya telah memeriksa jawabannya, dan meskipun saya menyukai gagasan mengandalkan ZFS untuk menangani kesalahan lapisan data, masih ada masalah pada file yang diubah, baik karena kesalahan atau jahat. ZFS tidak akan melindungi Anda dalam kasus itu, dan seperti orang lain yang disebutkan, itu tidak akan memberi Anda "hash" yang dapat dilihat pengguna untuk menyimpan di tempat lain untuk validasi eksternal.

Ada aplikasi Linux yang disebut Bransire yang digunakan secara luas untuk memantau executable sistem, untuk memvalidasi mereka tidak berubah setelah serangan. Proyek itu rupanya sekarang ditinggalkan, tetapi ada yang baru AIDE (Advanced Intrusion Detection Environment), direkomendasikan di ServerFault:

/server/62539/tripwire-and-alternatives

Ketika Anda menginstal, itu akan berjalan setiap x menit, dapat dikonfigurasi pengguna, dan itu akan memeriksa semua folder yang Anda tentukan untuk perubahan dalam file. Perlu dijalankan sekali untuk menghitung semua hash file, dan kemudian setelah itu, ia memeriksa semua hash terhadap file saat ini, dan memastikan semuanya masih sama. Anda dapat menentukan tipe hash atau kombinasi hash mana yang akan digunakan (saya tidak akan merekomendasikan apa pun yang lebih lemah dari SHA-256), yang atribut file untuk digunakan (konten, ukuran, timestampst yang dimodifikasi, dll), frekuensi di mana ia memeriksa, bagaimana / di mana menyimpan basis data hash, dll.

Beberapa orang mungkin menganggap ini berlebihan, tetapi tergantung pada persyaratan OP, itu mungkin memberinya lebih banyak ketenangan pikiran bahwa data yang disimpannya akan tetap sama setelah titik waktu tertentu.

mjuarez
sumber
0

Arsip Nasional Australia telah mengembangkan [Checksum Checker] ( http://checksumchecker.sourceforge.net/ ) yang tersedia secara bebas di bawah GPLv3.

Bunyinya checksum dan algoritma dari database, kemudian menghitung ulang checksum untuk file, membandingkan dua nilai dan melaporkan jika ada kesalahan. Ini mendukung MD5, SHA1, SHA2, SHA256 dan algoritma SHA512.

Perangkat lunak lain dalam repositori digital [DPR] mereka ( http://dpr.sourceforge.net/ ) menghasilkan checksum awal (serta melakukan semua kegiatan pemrosesan lainnya)

John Lovejoy
sumber