해싱 및 메시지 인증 페이지의 모든 해시는 단 한 비트만 바뀌어도 완전히 무관한 다이제스트가 나오도록 만들어져 있습니다. TLSH(Trend Micro Locality Sensitive Hash)는 그 반대로 만들어졌습니다: 비슷한 입력은 비슷한 다이제스트를 만들며, sgcTLSH_Diff는 두 다이제스트가 서로 얼마나 떨어져 있는지 점수를 매깁니다. 이는 "이 두 파일이 동일한가"가 아니라 "이 두 파일이 얼마나 비슷한가"에 답하며, 이것이 클러스터링과 근사 중복 탐지, 악성코드 계열 분류, 그리고 복사되어 약간 수정된 문서를 찾는 데 유용한 이유입니다.
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;
두 다이제스트 비교하기
function sgcTLSH_Diff(const aLeft, aRight: string; aLengthDiff: Boolean = True): Integer;
0(cTLSH_IdenticalDiff)은 같은 다이제스트를 의미하며, 점수는 두 입력이 다를수록 커지고 고정된 상한이 없습니다. 보편적인 임계값은 없으므로 자신의 데이터 집합에 맞춰 보정해야 하지만, 대략적인 출발점으로 30 미만의 거리는 대개 같거나 거의 같은 내용을 나타내며, 값이 클수록 점점 관련성이 낮아집니다. aLengthDiff는 입력 길이의 차이를 점수에 반영합니다. 서로 다른 크기로 로테이션된 로그 파일처럼 정당하게 패딩되었거나 잘린 내용을 비교할 때는 이를 꺼두십시오. 두 다이제스트 중 하나라도 형식이 잘못되었으면 함수는 -1을 반환합니다.