ハッシュ化 & メッセージ認証ページのすべてのハッシュは、1ビットの変更がまったく無関係なダイジェストを生成するように作られています。TLSH(Trend Micro Locality Sensitive Hash)は、その正反対を目指して作られています。似た入力は似たダイジェストを生成し、sgcTLSH_Diffが2つのダイジェストがどれだけ離れているかを数値化します。これは「これら2つのファイルは同一か」ではなく「これら2つのファイルはどれくらい似ているか」に答えるものであり、そのためクラスタリングや類似重複検出、マルウェアファミリーのトリアージ、そしてコピーして軽く編集された文書の発見に役立ちます。
TLSH はセキュリティ用のハッシュではありません。完全性の検証や認証には使用しないでください。
衝突耐性はなく、入力を制御できる攻撃者はダイジェストを意図的に誘導できます。すべての関数はsgcCrypto_TLSHにあります。
ダイジェストの計算
入力は少なくとも 50 バイト(cTLSH_MinDataLength)必要で、内部バケットの半分以上を埋められるだけの多様性が必要です。ダイジェストは 72 文字(cTLSH_DigestLength)で、バージョンプレフィックスT1から始まります。短すぎる入力や均一すぎる入力(たとえば同じバイトが長く続く場合など)は、特徴付けるための十分な情報を持たないため、以下の関数は意味のないダイジェストではなく空の文字列を返します。
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;
大きなファイルを一度にメモリへ読み込む必要はありません。ブロック単位でストリーミングインターフェースに供給するか、ストリームを直接sgcTLSH_Streamに渡してください。
procedure sgcTLSH_Init(var aContext: TsgcTLSHContext);
procedure sgcTLSH_Update(var aContext: TsgcTLSHContext; const aData: TBytes);
function sgcTLSH_Final(var aContext: TsgcTLSHContext): string;
2つのダイジェストの比較
function sgcTLSH_Diff(const aLeft, aRight: string; aLengthDiff: Boolean = True): Integer;
ゼロ(cTLSH_IdenticalDiff)は同一のダイジェストを意味し、スコアは2つの入力がどれだけ異なるかに応じて大きくなり、上限は固定されていません。普遍的なしきい値は存在しないため、自分自身のコーパスに対して調整する必要がありますが、目安としては、距離がおよそ 30 未満であれば同一またはほぼ同一の内容であることを示す場合が多く、値が大きくなるほど関連性は徐々に低くなります。aLengthDiffは、入力長の差をスコアに織り込みます。異なるサイズでローテーションされたログファイルのように、正当にパディングまたは切り詰められたコンテンツを比較する場合はオフにしてください。いずれかのダイジェストが不正な形式の場合、この関数は -1 を返します。