1. 程式人生 > >模糊雜湊演算法工具ssdeep的使用

模糊雜湊演算法工具ssdeep的使用

轉自:http://blog.csdn.net/chichoxian/article/details/54849406

引言

ssdeep 是一個用來計算context triggered piecewise hashes(CTPH) 基於文字的分片雜湊演算法 ,同樣也可以叫做模糊雜湊 Fuzzy hashes。CTPH可以匹配同源文件(相似文件),這樣的文件可能有一些順序相同的位元組,儘管這些位元組可能在一個序列中長度和內容都不盡相同。

這個是 ssdeep 的程式碼和使用指南連結: ssdeep code

注意,在安裝的時候,如果你使用的是預設的安裝路徑/usr/local/bin.這個時候你必須要獲得root許可權, 可以使用sudo 來完成

    $ sudo make install 

基本操作

一般情況下,ssdeep能對每一個檔案產生CTPH,模糊雜湊。

產生的方法如下:

C:\temp> ssdeep config.h INSTALL doc\README

得到的結果如下:

ssdeep,1.0--blocksize:hash:hash,filename
96:KQhaGCVZGhr83h3bc0ok3892m12wzgnH5w2pw+sxNEI58:FIVkH4x73h39LH+2w+sxaD,"C:\temp\config.h"
96:MD9fHjsEuddrg31904l8bgx5ROg2MQZHZqpAlycowOsexbHDbk
:MJwz/l2PqGqqbr2yk6pVgrwPV,"C:\temp\INSTALL" 96:EQOJvOl4ab3hhiNFXc4wwcweomr0cNJDBoqXjmAHKX8dEt001nfEhVIuX0dDcs:3mzpAsZpprbshfu3oujjdENdp21,"C:\temp\doc\README

注意得到的結果輸出是檔案的全路徑。我們可以使用ssdeep 來得到檔案的相對路徑,為了得到相對路徑我們可以使用引數 -l ,重複上面的例子,我們使用引數-l來得出我們的結果

C:\temp> ssdeep -l config.h INSTALL doc\README 
ssdeep,1.0–blocksize:hash:hash,filename 
96:KQhaGCVZGhr83h3bc0ok3892m12wzgnH5w2pw+sxNEI58:FIVkH4x73h39LH+2w+sxaD,”config.h” 
96:MD9fHjsEuddrg31904l8bgx5ROg2MQZHZqpAlycowOsexbHDbk:MJwz/l2PqGqqbr2yk6pVgrwPV,”INSTALL” 
96:EQOJvOl4ab3hhiNFXc4wwcweomr0cNJDBoqXjmAHKX8dEt001nfEhVIuX0dDcs:3mzpAsZpprbshfu3oujjdENdp21,”doc\README”

如果你只想輸出檔名我們可以使用引數 -b ,例子如下:

C:\temp> ssdeep -b config.h INSTALL \doc\README
ssdeep,1.0--blocksize:hash:hash,filename
96:KQhaGCVZGhr83h3bc0ok3892m12wzgnH5w2pw+sxNEI58:FIVkH4x73h39LH+2w+sxaD,"config.h"
96:MD9fHjsEuddrg31904l8bgx5ROg2MQZHZqpAlycowOsexbHDbk:MJwz/l2PqGqqbr2yk6pVgrwPV,"INSTALL"
96:EQOJvOl4ab3hhiNFXc4wwcweomr0cNJDBoqXjmAHKX8dEt001nfEhVIuX0dDcs:3mzpAsZpprbshfu3oujjdENdp21,"README"錯誤資訊

如果我們沒有指定特定的檔案,這個時候一個錯誤資訊提示就會出現

C:\temp> ssdeep 
ssdeep: No input files

ssdeep 不支援管道操作。如果一個輸入檔案沒有找到,ssdeep將會提示出一個錯誤的資訊,如果想要忽略這個錯誤的資訊,我們可以使用-s這個操作

C:\temp> ssdeep doesnotexist.txt 
ssdeep: C:\temp\doesnotexist.txt: No such file or directory 
C:\temp> ssdeep -s doesnotexist.txt 
C:\temp>

迭代模式(Recursive Mode)

一般情況下如果我們嘗試處理一個目錄的話那麼將會產生一個錯誤的資訊,在迭代模式下,ssdeep 將會雜湊該目錄下的所有檔案,以及這個目錄檔案下的子目錄的所有檔案, 迭代模式可以使用 -r引數

C:\temp> ssdeep *
ssdeep: C:\temp\backups Is a directory
ssdeep,1.0--blocksize:hash:hash,filename
96:KQhaGCVZGhr83h3bc0ok3892m12wzgnH5w2pw+sxNEI58:FIVkH4x73h39LH+2w+sxaD,"config.h"
ssdeep: C:\temp\www Is a directory

C:\temp> ssdeep -r *
ssdeep,1.0--blocksize:hash:hash,filename
768:McAQ8tPlH25e85Q2OiYpD08NvHmjJ97UfPMO47sekO:uN9M553OiiN/OJ9MM+e3,"C:\temp\backups\mystuff.zip"
384:bcEKuglk+GUYIk90a1lEF+Wfsy2solvW8mK1enQXP79:bmlFGUNk9L1roy4K1enQ,"C:\temp\backups\ssdeep.exe"
96:CFzROqsgconvv7uUo6jTcEGEvpVCN116S:CNVnqj8cMVCv16,"C:\temp\backups\foo.doc"
96:KQhaGCVZGhr83h3bc0ok3892m12wzgnH5w2pw+sxNEI58:FIVkH4x73h39LH+2w+sxaD,"config.h"
96:aN0jOc0WlWW+LWQnjv7ufGcE5ESr5YaZ6uicEDEO9VCN116Sb5EutkB:aSeoF+L/zqfGtfr5YiWcsVCv16W5htk,"C:temp\www\index.html"

匹配模式

在ssdeep 中最強大的功能就是匹配輸入檔案的雜湊和一系列已知的hash值做比較,由於模糊雜湊的不嚴格性,注意這裡指的是ssdeep能夠指示兩個檔案是匹配,但是這不以為著這些檔案是相關的。你應該獨立的檢測每一對檔案的相似性,看他們是怎麼相關的。

我們建立一個檔案叫做foo.txt 這個時候我們複製foo.txt 到檔案bar.txt中

$ ls -l foo.txt
-rw-r--r--   1 jessekor  jessekor  240 Oct 25 08:01 foo.txt

$ cp foo.txt bar.txt
$ echo 1 >> bar.txt

這個時候我們用傳統的加密hash演算法MD5他並不能匹配這兩個hash, 因為只要一個位元組的輕微變動都會使得他們的hash產生巨大的變化。

$ md5deep foo.txt bar.txt 
7b3e9e08ecc391f2da684dd784c5af7c /Users/jessekornblum/foo.txt 
32436c952f0f4c53bea1dc955a081de4 /Users/jessekornblum/bar.txt

但是對於這種情況,fuzzy hashing卻可以做到,我們首先計算foo.txt的hash值,然後把它儲存到hashes.txt這個檔案中,這個時候我們比較foo.txt檔案的hash值,和bar.txt的hash值看它們之間的相似程度

在這裡我們使用引數-m ,-m 需要後面接兩個引數,一個是一個已知的檔案的hash值,另一個是輸入的檔案(需要比較的檔案)

$ ssdeep -b foo.txt > hashes.txt
$ ssdeep -bm hashes.txt bar.txt
bar.txt matches foo.txt (64)

在括號裡面的值是相似度得分,這個分數越高就說明這兩個檔案越相似

原始碼複用檢測

ssdeep 最實用的功能就是匹配功能,你可以使用ssdeep 的匹配模式來找出原始碼的複用。假設有兩個資料夾,在這些資料夾中包含了一堆程式碼,我們可以先計算出一個資料夾下的樹結構上的所有檔案的hash值在和另外的一個資料夾下的所有檔案進行一一比對,找出相似程式碼。

假設一個資料夾叫做md5deep-1.12 和一個資料夾叫做ssdeep-1.1,我們比較這兩個資料夾下的程式碼複用情況

C:\> ssdeep -lr md5deep-1.12 > md5deep-hashes.txt

C:\>ssdeep -lrm md5deep-hashes.txt ssdeep-1.1
ssdeep-1.1\cycles.c matches md5deep-1.12\cycles.c (94)
ssdeep-1.1\dig.c matches md5deep-1.12\dig.c (35)
ssdeep-1.1\helpers.c matches md5deep-1.12\helpers.c (57)

相關推薦

模糊演算法工具ssdeep的使用

轉自:http://blog.csdn.net/chichoxian/article/details/54849406 引言 ssdeep 是一個用來計算context triggered piecewise hashes(CTPH) 基於文字的分片雜湊演算法 ,同樣也可

QMap QHash的選擇(QString這種複雜的比較,演算法比map快很多)

QMap QHash有近乎相同的功能。很多資料裡面介紹過他們之間的區別了。但是都沒有說明在使用中如何選擇他們。 實際上他們除了儲存順序的差別外,只有key操作的區別。 雜湊演算法是將包含較多資訊的“key”轉換成包含資訊較少的“key的key”。通過“key的key”查詢key,在通過key找到value

java中的演算法和hashcode深入講解

java中的雜湊演算法和hashcode深入講解 一,雜湊演算法的概念     在計算機領域,雜湊演算法具有非常廣泛的應用,比如快速查詢和加密。今天我們來討論一下雜湊演算法。我們先從理論知識開始。 1,什麼是雜湊演算法  &

密碼學之Hash演算法

      前言 在第一篇文章中已經有介紹區塊鏈技術概念,我們知道區塊鏈主要是由共識演算法機制、p2p網路、密碼學這幾個核心技術組成,前面幾篇文章講了共識演算法,p2p網路,這次我們談一下密碼學,密碼學是區塊鏈系統的基礎,如果沒有密碼學技術支撐,區

據說,80%的人都搞不懂演算法 區塊鏈 演算法

本文約9000字+,閱讀(觀看)需要52分鐘 聊到區塊鏈的時候也少不了會聽到“雜湊”、“雜湊函式”、“雜湊演算法”,是不是聽得一頭霧水?別急,這一講我們來講講什麼是雜湊演算法。 雜湊是一種加密演算法 雜湊函式(Hash Function),也稱為雜湊函式或雜湊函式。雜湊函式是一個

hashcode和equals及演算法理解

因為會設計到很多equal的知識,所以先深入理解一下equals(). 1.equals() Object類中的預設equals()方法和==是沒有區別的,都是判斷兩個物件是否指向同一個引用,記憶體地址是否相同,即是否就是一個物件。而string類和integer等,都需要重寫equals()方

資料結構與演算法之美專欄學習筆記-演算法

雜湊演算法的定義和原理 將任意長度的二進位制串對映為固定長度的二進位制串。 這個對映的規則就是雜湊演算法,而通過原始資料對映之後得到的二進位制串就是雜湊值。 設計一個優秀的雜湊演算法需要滿足: 從雜湊值不能反向推匯出原始資料(所以雜湊演算法也叫單向雜湊演算法); 對輸入資料非常敏感,哪怕原始

密碼學(對稱與非對稱密碼 演算法)

目錄 密碼學 密碼學發展 對稱加密體制 非對稱加密體制 混合加密 雜湊演算法 數字簽名過程 密碼學的應用--網站認證 密碼學 密碼學發展 古典密碼:古代----19世紀末 近代密碼:20世紀初---1949年 現代密碼:1949(夏農

<Golang>MD5、SHA256等演算法介紹、應用場景及具體實現

版權宣告:本文為作者原創,如需轉載,請註明出處https://blog.csdn.net/weixin_42940826 前言 MD5和SHA256是非常常用的兩種單向雜湊函式,雖然MD5在2005年已經被中國密碼學家王小云攻破,但是曾經也是叱吒風雲的被大規模使用,現在

MySQL索引演算法——演算法

雜湊索引 雜湊索引(hash index)基於雜湊表實現,只有精確匹配索引所有列的查詢才有效。對於每一行資料,儲存引擎都會對所有的索引列計算一個雜湊碼(hash code),  雜湊碼是一個較小的值,並且不同鍵值的行計算出來的雜湊碼也不一樣。雜湊索引將所

https是如何加密的 (知道了原理之後,希望自己能用程式碼實現一下,還有用於對個人資訊和公鑰進行加密的演算法,有時間也去查一下)

由於http協議是明文傳輸資料,資料的安全性沒有保障。為了改進這種明文傳輸協議,https誕生了。   https是在應用層和傳輸層之間,增加了一層ssl加密。對於加密,請往下看:   1、對稱加密   每次在傳送資料之前,伺服器先生成一把金鑰,

4.4.2 python 字串雙指標/演算法2 —— Substring with Concatenation of All Words & Group Anagrams

這兩道題目都很巧妙的應用了雜湊演算法,可以作為雜湊演算法的應用講解,後面介紹雜湊的時候就不再做題了哈。 30. Substring with Concatenation of All Words You are given a string, s, and a list of wor

4.4.1 python 字串雙指標/演算法1—— Reverse Vowels of a String & Longest Substring Without Repeating Char

這一部分開始,我們應用雙指標及雜湊等常見的簡單的演算法,解決一些字串的難題。 345. Reverse Vowels of a String Write a function that takes a string as input and reverse only the vow

資料結構與算法系列16--演算法

什麼的雜湊演算法? 將任意長度的二進位制值串對映為固定長度的二進位制值串,這個對映的規則就是雜湊演算法。而通過原始資料對映後得到的二進位制值串就是雜湊值。 一個優秀的雜湊演算法應該滿足哪幾點? 從原始資料計算得到的雜湊值,不能反向推匯出原始資料的值。 對輸入的資料非

LeetCode | 你不得不瞭解的演算法

⒈雜湊是什麼 ? 問大家一個問題 。如果手機上儲存了 1000 個聯絡人 ,現在要你給小詹打個電話 ,跟他說 ,他老婆喊他回家吃飯 。你會怎麼做 ? 當然是按姓名搜尋呀 !(假裝你有小詹電話號碼~)言歸正傳 ,那你能想到這和雜湊表有異曲同工之妙嘛 ? 雜湊表簡單說可以理解成一個對映關係

十一、演算法

業界著名的雜湊演算法也有很多,比如 MD5、SHA 等。 側重點:在實際應用中,如何用雜湊演算法解決問題? 一、概述 雜湊演算法:將任意長度的二進位制值串對映為固定長度的二進位制值串的對映規則; 雜湊值:通過原始資料對映之後得到的二進位制值串。 二、雜湊演算法的設計要求

關於一致性演算法

假設我們有 K 個機器,資料的雜湊值的範圍為 [0, MAX]。我們將整個範圍劃分為 m 個小區間(m 遠大於 K),每個機器負責 m/K 個小區間。當有新機器加入的時候,我們就將某幾個小區間的資料搬移到新機器上去。這樣,既不用全部重新計算雜湊值,搬移資料,也保持了各個機器上資料數量的均衡。 1

解讀:DENC加密演算法演算法

2018年可以說是區塊鏈元年,隨著區塊鏈技術的落地生根,已經開始讓大眾接觸並逐步應用。有關區塊鏈的加密演算法,如今主要應用於區塊鏈技術的有以DES、AES為代表的對稱加密演算法,以RSA為代表的非對稱加密演算法,和以MD5為代表的雜湊演算法。分散式能源物聯網公司DENC,構建

【LeetCode】1. Two Sum + 演算法

傳送門:https://leetcode.com/problems/two-sum/#/description 一、題目描述 Given an array of integers, return indices of the two numbers such that they

【轉】一致性演算法

在瞭解一致性雜湊演算法之前,最好先了解一下快取中的一個應用場景,瞭解了這個應用場景之後,再來理解一致性雜湊演算法,就容易多了,也更能體現出一致性雜湊演算法的優點,那麼,我們先來描述一下這個經典的分散式快取的應用場景。 場景描述 假設,我們有三臺快取伺服器,用於快取圖片,我們為這三臺快取伺服器編號為0