Bulanık Hash'leme (TLSH)

Hash'leme ve Mesaj Kimlik Doğrulama sayfasındaki her hash, tek bir değişen bitin tamamen ilgisiz bir özet üretmesi için kurulmuştur. TLSH (Trend Micro Locality Sensitive Hash), tam tersini yapmak için kurulmuştur: benzer girdiler benzer özetler üretir ve sgcTLSH_Diff, iki özetin ne kadar birbirinden uzak olduğunu puanlar. "Bu iki dosya birbirinin aynısı mı" yerine "bu iki dosya ne kadar benzer" sorusunu yanıtlar; bu da onu kümeleme ve neredeyse aynı içerik tespiti, kötü amaçlı yazılım ailesi triyajı ve kopyalanıp hafifçe düzenlenmiş belgeleri bulma için kullanışlı kılan şeydir.

 

TLSH bir güvenlik hash'i değildir. Bunu bütünlük veya kimlik doğrulama için kullanmayın.

 

Çarpışmaya dayanıklı değildir ve girdiyi kontrol eden bir saldırgan, özeti kasıtlı olarak yönlendirebilir. Her fonksiyon sgcCrypto_TLSH içindedir.

 

Bir özet hesaplama

 

Girdi en az 50 bayt olmalıdır (cTLSH_MinDataLength) ve dahili kovaların yarısından fazlasını doldurmaya yetecek kadar çeşitli olmalıdır; bir özet 72 karakterdir (cTLSH_DigestLength), T1 sürüm önekiyle başlar. Çok kısa veya çok tekdüze olan bir girdi (örneğin, tekrarlanan tek bir baytın uzun bir dizisi), karakterize edecek yeterli sinyale sahip değildir ve aşağıdaki fonksiyonlar anlamsız bir özet yerine boş bir dize döndürür.

 


function sgcTLSH(const aData: TBytes): string;
function sgcTLSH_Stream(aStream: TStream): string;
function sgcTLSH_IsValid(const aDigest: string): Boolean;

var
  vDigest: string;
begin
  vDigest := sgcTLSH(oFileBytes);
  if vDigest = '' then
    { too short or too uniform to characterize }
  else
    { vDigest is a 72-character T1... string };
end;

 

Büyük bir dosyanın bir kerede bellekte tutulmasına gerek yoktur; bloklar halinde akış arayüzünden geçirin, veya doğrudan sgcTLSH_Stream'e bir akış (stream) geçirin:

 


procedure sgcTLSH_Init(var aContext: TsgcTLSHContext);
procedure sgcTLSH_Update(var aContext: TsgcTLSHContext; const aData: TBytes);
function sgcTLSH_Final(var aContext: TsgcTLSHContext): string;

 

İki özeti karşılaştırma

 


function sgcTLSH_Diff(const aLeft, aRight: string; aLengthDiff: Boolean = True): Integer;

 

Sıfır (cTLSH_IdenticalDiff) aynı özet anlamına gelir; puan, iki girdinin ne kadar farklı olduğuyla birlikte büyür, sabit bir üst sınırı yoktur. Evrensel bir eşik yoktur, bunu kendi veri kümenize göre kalibre edin; ama bir başlangıç noktası olarak kabaca 30'un altındaki bir mesafe genellikle aynı veya neredeyse aynı içeriği gösterirken, daha yüksek değerler gitgide daha az ilişkiyi gösterir. aLengthDiff, girdi uzunluğundaki farkı puana katlar; farklı boyutlarda döndürülmüş günlük dosyaları gibi meşru şekilde doldurulmuş veya kesilmiş içerikleri karşılaştırırken bunu kapatın. Fonksiyon, özetlerden biri bozuksa -1 döndürür.