DedSec Project

Υπολογισμός SHA-256 αρχείου — DedSec Project

Συνταγή: σταδιακό SHA-256 για έλεγχο αρχείων Πότε χρησιμοποιείται και τι πρέπει να επιτύχει Η συνταγή υπολογίζει αποτύπωμα SHA-256 από τοπικό αρχείο χωρίς να φορτώνει ολόκληρο το…

Συνταγή: σταδιακό SHA-256 για έλεγχο αρχείων

Πότε χρησιμοποιείται και τι πρέπει να επιτύχει

Η συνταγή υπολογίζει αποτύπωμα SHA-256 από τοπικό αρχείο χωρίς να φορτώνει ολόκληρο το περιεχόμενο στη μνήμη. Χρησιμοποίησέ την για σύγκριση με ήδη έμπιστο αναμενόμενο αποτύπωμα, για παράδειγμα σε πόρο που κατεβάστηκε για offline χρήση. Η δοκιμή αλλάζει το μέγεθος ανάγνωσης από ένα byte σε 64 KiB και επιβεβαιώνει ότι μία αλλαγή στο αρχείο αλλάζει το αποτέλεσμα.

Πλήρες εκτελέσιμο παράδειγμα

Αποθήκευσε ως 02_File_hash.py και εκτέλεσε με Python 3. Χρησιμοποιούνται προσωρινά δεδομένα και δεν απαιτείται δίκτυο.

import hashlib, tempfile
from pathlib import Path
def sha256_file(path, chunk_size=65536):
    if type(chunk_size) is not int or chunk_size < 1:
        raise ValueError("invalid chunk size")
    digest = hashlib.sha256()
    with open(path, "rb") as stream:
        for chunk in iter(lambda: stream.read(chunk_size), b""):
            digest.update(chunk)
    return digest.hexdigest()
with tempfile.TemporaryDirectory() as directory:
    item = Path(directory) / "αρχείο.bin"
    item.write_bytes(b"abc")
    expected = hashlib.sha256(b"abc").hexdigest()
    assert sha256_file(item, 1) == expected
    assert sha256_file(item, 65536) == expected
    item.write_bytes(b"abcd")
    assert sha256_file(item) != expected
    item.write_bytes(b"")
    assert sha256_file(item) == hashlib.sha256(b"").hexdigest()
print("PASS streaming file SHA-256")

Εγγυήσεις και περιορισμοί

Το αποτύπωμα ενημερώνεται σταδιακά πάνω σε ακατέργαστα byte και δεν εξαρτάται από το μέγεθος τμήματος ανάγνωσης. Ελληνικά γράμματα στο όνομα δεν επηρεάζουν τα δεδομένα του αρχείου. Ακόμη και το κενό αρχείο έχει συγκεκριμένο αποτύπωμα. Ίδιο SHA-256 σημαίνει ότι τα byte συμφωνούν με την έμπιστη αναφορά τη στιγμή του ελέγχου, όχι ότι είναι γνήσιος ο δημιουργός ή ότι δεν γινόταν ταυτόχρονη εγγραφή. Αν άλλη διεργασία τροποποιεί το αρχείο, ίσως διαβαστεί ασυνεπές στιγμιότυπο.

Εργαστήριο προσαρμογής

Δημιούργησε τεχνητό αρχείο 10 MiB και σύγκρινε αποτελέσματα με τμήματα 1, 4096 και 65536 byte. Χειρίσου χωριστά FileNotFoundError και PermissionError. Σκέψου πώς θα εντόπιζες αλλαγή κατά την ανάγνωση· ούτε το μέγεθος ούτε η χρονοσήμανση παρέχουν απόλυτη ατομικότητα. Μη θεωρείς ότι ένα αποτύπωμα αντικαθιστά έλεγχο υπογραφής.

Αντιμετώπιση προβλημάτων

Αν δύο αρχεία με οπτικά ίδιο κείμενο δίνουν άλλο αποτύπωμα, σύγκρινε ακριβή byte, τερματισμούς γραμμών, BOM και μορφές Unicode. Για έλεγχο ακεραιότητας δεν πρέπει να κάνεις αποκωδικοποίηση ή κανονικοποίηση. Εξέτασε και την προέλευση του αναμενόμενου αποτυπώματος.