Konuyu Açan #1
Python Dosya Hash Envanteri Oluşturma

[quote]Giriş ve amaç
Bir dizin yapısındaki tüm dosyaların benzersiz kimliklerini güvenli bir şekilde belirmek için basit, tekrarlanabilir ve hızlı bir yöntem aradığınızda, dosya hash envanteri oluşturmak etkili bir çözümdür. Bu envanter, değişiklik takibi, karşılaştırmalı yedekleme analizleri veya güvenlik ihlallerinde değişim tespiti gibi senaryolarda kullanışlıdır. Aşağıda, yalın ve güvenilir bir yaklaşım için adımları ve temel koda odaklanan bir kılavuz sunuyorum.

1) Planlama ve seçimler
  • Hangi hashing algoritmasını kullanacaksınız? güvenlik ve hız arasında bir denge gerekir. genellikle SHA-256 veya BLAKE3 gibi modern seçenekler tercih edilir.
  • Hangi içeriği hesaplarsınız? sadece dosya içeriği mi, yoksa metadata (boyut, değiştirilme tarihi) ile birlikte mi? Dosya içeriğini temel alan hash, içerik değişikliklerini güvenilir şekilde yakalar.
  • Sonuçları nasıl saklaysınız? JSON, CSV veya basit bir tablo olarak çıktı alınabilir. Hangi anahtarlar kullanılacak? yol, boyut, hash değerleri gibi.


2) Temel yaklaşım ve akış
  • Dizin tarama: os.walk veya daha performans odaklı çözümler ile tüm alt dizinler taranır.
  • Dosya filtreleme: isfile ile dosyalar sınırlandırılır; bazı sistem dosyalarını veya belirli uzantıları hariç tutmak gerekebilir.
  • Hash hesaplama: blok boyutuyla akış halinde okuma (örn. 4 KiB veya 64 KiB) ve akışlı hesaplama ile bellek kullanımı minimize edilir.
  • Sonuç yapısı: her dosya için yol, boyut, son değiştirilme zamanı ve hash değeri bir kayıtta tutulur.


3) Örnek yaklaşım ve temel kod
Aşağıda basit ama güvenilir bir Python taslağı verilmiştir. Kullandığınız sürüme ve gereksinimlerinize göre genişletilebilir.

KOD
1234567891011121314151617181920212223242526272829303132333435363738394041424344import os
import hashlib
import json
from datetime import datetime

def hash_file(path, algorithm='sha256', chunk_size=65536):
    h = hashlib.new(algorithm)
    with open(path, 'rb') as f:
        while chunk := f.read(chunk_size):
            h.update(chunk)
    return h.hexdigest()

def build_inventory(root_dir, algorithm='sha256', follow_symlinks=False):
    inventory = []
    for dirpath, dirnames, filenames in os.walk(root_dir, followlinks=follow_symlinks):
        for name in filenames:
            full_path = os.path.join(dirpath, name)
            try:
                if not os.path.isfile(full_path):
                    continue
                stat = os.stat(full_path)
                file_hash = hash_file(full_path, algorithm=algorithm)
                inventory.append({
                    'path': full_path,
                    'size': stat.st_size,
                    'mtime': datetime.fromtimestamp(stat.st_mtime).isoformat(),
                    'hash': file_hash,
                    'algorithm': algorithm
                })
            except (OSError, PermissionError):
                # izin problemi veya erişilemeyen dosya için es geç
                continue
    return inventory

def save_inventory(inventory, out_path):
    with open(out_path, 'w', encoding='utf-8') as f:
        json.dump(inventory, f, ensure_ascii=False, indent=2)

if [b]name[/b] == '[b]main[/b]':
    root = '/path/to/target'  # hedef dizin
    out = 'inventory.json'
    inv = build_inventory(root, algorithm='sha256')
    save_inventory(inv, out)
    print(f'Envanter dosyası kaydedildi: {out}')


4) Performans ve güvenlik notları
  • Büyük dizinler için paralel işleme düşünülebilir ama dosya kilitleri veya I/O sınırlamaları göz önünde bulundurulmalı.
  • Hermetik çıktı için çıktıya path normalization ve güvenli karakter kontrolü eklemek faydalı olabilir.
  • Hash karşılaştırması için çıktıyı zaman damgası ile sürdürün; değişiklik incelemesinde hangi dosyada değişiklik olduğunu hızlıca tespit etmek kolaylaşır.


5) Genişletme önerileri
  • Çıktıya dosya türü ve izin bilgisi eklemek.
  • Değişiklik tespiti için önceki envanterlerle karşılaştırma fonksiyonu yazmak.
  • Sık kullanılan dosya türleri için özel işleme (örneğin büyük medya dosyalarında önizleme hash’leri).
  • CLI arayüzü ile parametreli çalıştırma, çıktı formatlarını (CSV, JSON) desteklemek.


Bu örnekle başlamak mümkün; kurulum ve entegrasyon ihtiyaçlarınıza göre jetonlayıcı bir sürüm veya daha hızlı I/O odaklı varyasyonlar oluşturabiliriz. Sizce hangi hedef üzerinde çalışıyorsunuz: tek seferlik envanter mi yoksa düzenli değişiklik izleme mi? Ayrıca hangi çıktı formatını tercih ediyorsunuz?

Yanıt vermek için giriş yapmış olmalısınız.

0 alıntı seçildi