Esiste un algoritmo di hash in grado di identificare file o stringhe simili?

8

Esiste un algoritmo di hash che ti aiuterà a identificare file o stringhe simili? Ad esempio, l'hash per ABC e XBC sarebbe simile piuttosto che radicalmente diverso come di solito è il caso. Conosco una misura di somiglianza, Modifica distanza ( link ). Ma questo non ti dà un hash per ogni input da confrontare, solo un punteggio tra due ingressi qualsiasi.

Aggiorna

Il commento di Andan (hashing sensibile alla località, LSH) è quello che stavo cercando. Il motivo per cui ho posto la domanda è che mi stavo chiedendo come utilizzare LSH nella ricerca di malware. È usato per identificare il malware? Perché o perché no?

Aggiorna

In linea con le risposte di Tom Leek, ho fatto delle indagini personali. Ho scritto un programma che avrebbe XOR i byte di un file con un modello "casuale" predeterminato (il seme non è cambiato). Quindi sommerebbe il totale di 1 bit. Ciò produrrebbe la distanza di Hamming dal modello casuale al file. In realtà, non era una metrica molto utile in quanto fondamentalmente (in media) si limitava a dimezzare le dimensioni del file per ottenere un numero.

Alcuni esempi:

Due eseguibili correlati ho scannerizzato con punteggio 2684964 e 2738772 per una differenza di 53808. Sono decisamente correlati (versioni differenti dei programmi che ho scritto) ma il valore di 53k è vicino alla metà della differenza di dimensione del file in bit: ~ 128k. Quindi non è una metrica utile per determinare la somiglianza.

Ho scansionato due JPEG di dimensioni simili che erano immagini decisamente diverse. Hanno scansionato come 3124915 e 3110981 per una differenza di 13934. Quindi la loro differenza era "più piccola" della differenza tra l'eseguibile correlato, anche se non sono correlati. Quindi non è una metrica utile per determinare la differenza.

Conclusione:

Come ha detto Tom Leek, è un problema aperto per una ragione.

    
posta John 31.10.2013 - 17:33
fonte

3 risposte

5

Ci sono buone ragioni teoriche per cui un tale hash non può esistere o non può essere "un hash" nel senso crittografico del termine . Per dirla semplicemente, se i valori hash di due input "simili" sono essi stessi "simili" l'uno all'altro, è possibile utilizzarlo per recuperare in modo efficiente un input da un dato output, il che contraddice la resistenza preimage .

Dai tuoi tag, suppongo che tu stia cercando di progettare un software antivirus che conosca le "firme" di virus N e che cosa rilevare qualsiasi virus "simile" (per alcune nozioni di somiglianza ) a uno qualsiasi di questi valori N , ma con un costo computazionale notevolmente inferiore rispetto ai confronti N (perché N può essere molto elevato). Quando la nozione di somiglianza è "eguaglianza esatta", puoi ordinare le firme e fare una ricerca binaria con costo O (log N) (le funzioni hash vengono quindi utilizzate per rendere il processo ancora più veloce, assicurando che tutte le "firme" hanno una dimensione costante fissa). Tuttavia, per una nozione di somiglianza che non è così acuta, il problema diventa difficile.

La ricerca della similarità del database è un problema noto di bioinformatica dove viene utilizzato per sequenze di nucleotidi e oggetti simili che devono essere abbinati in enormi database nonostante le differenze occasionali. La linea di fondo è quella:

  • Esistono possibili soluzioni, ma si basano su un modello probabilistico delle differenze effettive che si possono incontrare.
  • Le persone hanno cercato una soluzione valida per decenni e stanno ancora cercando.

Gli effettivi metodi utilizzati dal software antivirus per verificare la presenza di firme senza rallentare la macchina sono alla base della loro attività, quindi sono comprensibilmente poco chiacchieroni. Possiamo supporre che qualsiasi soluzione che escano potrebbe implicare molte modifiche e ipotesi sulle reali variazioni del virus osservate in natura.

    
risposta data 31.10.2013 - 18:24
fonte
6

"Algoritmi approssimativi di abbinamento" (ancora una bozza NIST) o "funzioni di hash di preservazione della similarità" potrebbero essere di tuo interesse. Questi algoritmi sono progettati specificamente per determinare la somiglianza tra due oggetti digitali. Alcuni degli algoritmi proposti fino ad ora (e utili) sono (cronologicamente): ssdeep , sdhash , mrsh -v2.

Per determinare la somiglianza tra gli oggetti, questi algoritmi richiedono un numero minimo di dati. Mrsh-v2 si comporta meglio in termini di dimensioni minime richieste.

Mrsh-v2 sembra essere molto promettente in termini di prestazioni e dimensioni minime richieste, ma ancora in fase di sviluppo. Spero che potenzialmente risolva il problema relativo alla gestione di file simili.

    
risposta data 31.10.2013 - 22:29
fonte
1

L'hashing è specificamente progettato per rendere gli input il più diversi possibile. Quello che vuoi è un algoritmo di cluster destinato a ordinare oggetti "simili" nello stesso contenitore adiacente. La similarità non è un concetto ben definito, avrete bisogno di una definizione specifica del dominio.

Proprio come un esperimento mentale, supponiamo di voler rilevare le frodi cartacee terminate tagliando e incollando da altri documenti. Potresti fare qualcosa del tipo:

  1. Hash ogni sequenza di 4 parole e conta il numero di occorrenze di ciascun hash.
  2. Elimina tutti gli hash che si verificano in un ampio dizionario di documenti comuni.
  3. Raccogli gli n più comuni hash che rimangono.

Per confrontare due documenti per similarità, conta quanti hash associati hanno in comune.

    
risposta data 31.10.2013 - 18:11
fonte

Leggi altre domande sui tag