1樓:匿名使用者
首先介紹下hash函式
hash函式(也稱雜湊函式或雜湊演算法)的輸入為任意長度的訊息,而輸出為某一固定長度的訊息,即hash函式是一種將任意長度的訊息串m對映成為乙個定長訊息的函式,記為h。稱h=h(m)為訊息m的hash值或訊息摘要,有時也稱為訊息的指紋。通常hash函式應用於數字簽名、訊息完整性檢查等方面。
設h是乙個hash函式,x是任意長度的二元串,相應的訊息摘要為y=h(x),通常訊息摘要是乙個相對較短的二元串。假設我們已經計算出了y的值,那麼如果有人改變了x的值為xˊ,則通過計算訊息摘要yˊ=h(xˊ),驗證yˊ與y不相等就可以知道原來的訊息x已被改變。
通常,hash函式可以分為兩類:不帶金鑰的hash函式和帶金鑰的hash函式。不帶金鑰的hash函式只需要有乙個訊息輸入;帶金鑰的hash函式規定要有兩個不同的輸入,即乙個訊息和乙個金鑰。
hash函式的目的是為指定的訊息產生乙個訊息「指紋」,hash函式通常具有以下這些性質:
壓縮性。hash函式將乙個任意位元長度的輸入x,對映成為固定長度為n的輸出h(x)。
正向計算簡單性。給定hash函式h和任意的訊息輸入x,計算h(x)是簡單的。
逆向計算困難性。對所有預先給定的輸出值,找到乙個訊息輸入使得它的hash值等於這個輸出,在計算上是不可行的。即對給定的任意值y,求使得h(x)=y的x在計算上是不可行的。
這一性質也稱為單向性。
弱無碰撞性。對於任何輸入,找到乙個與它有相同輸出的第二個輸入,在計算上是不可行的,即給定乙個輸入x,找到乙個xˊ,使得h(x)= h(xˊ)成立在計算上是不可行的。
強無碰撞性。找出任意兩個不同的輸入x與xˊ,使得h(x)= h(xˊ)成立在計算上是不可行的。
攻擊者可以對hash函式發起兩種攻擊。第一種是找出乙個xˊ,使得h(x)= h(xˊ)。例如,在乙個使用hash函式的簽名方案中,假設s是簽名者對訊息x的乙個有效簽名,s=sig(h(x))。
攻擊者可能會尋找乙個與x不同的訊息xˊ,使得h(x)= h(xˊ)。如果找得到,則攻擊者就可以偽造對訊息xˊ的簽名,這事因為s也是對訊息xˊ的有效簽名。hash函式的弱無碰撞性可以抵抗這種攻擊。
攻擊者還可以發起另一種攻擊,同樣乙個應用hash函式的簽名方案中,對手可能會尋找兩個不同的訊息x和xˊ,使得h(x)= h(xˊ),然後說服簽名者對訊息x簽名,得到s=sig(h(x))。由於s=sig(h(xˊ)),所以攻擊者得到了乙個對訊息xˊ的有效簽名。hash函式的強無碰撞性可以抵抗這種攻擊。
hash函式的另一種常見的攻擊方法是生日攻擊,感興趣的讀者可以參閱參考文獻中生日攻擊的的相關資料。為防止生日攻擊,通常的方法就是增加hash值的位元長度,一般最小的可接受長度為128位。常見的hash函式,如md5和sha分別具有128位元和160位元的訊息摘要。
什麼是hash函式
2樓:小小公尺
hash函式是把任意長度的輸入(又叫做預對映pre-image)通過雜湊演算法變換成固定長度的輸出,該輸出就是雜湊值。
這種轉換是一種壓縮對映,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,所以不可能從雜湊值來確定唯一的輸入值。
hash函式可以將乙個資料轉換為乙個標誌,這個標誌和源資料的每乙個位元組都有十分緊密的關係。hash演算法還具有乙個特點,就是很難找到逆向規律。
3樓:豔陽高照的午後
hash函式:
hash,一般翻譯做"雜湊",也有直接音譯為"雜湊"的,就是把任意長度的輸入(又叫做預對映, pre-image),通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,而不可能從雜湊值來唯一的確定輸入值。簡單的說就是一種將任意長度的訊息壓縮到某一固定長度的訊息摘要的函式。
演算法用途:
hash主要用於資訊保安領域中加密演算法,它把一些不同長度的資訊轉化成雜亂的128位的編碼裡,叫做hash值. 也可以說,hash就是找到一種資料內容和資料存放位址之間的對映關係。hash演算法在資訊保安方面的應用主要體現在以下的3個方面:
1)檔案校驗
我們比較熟悉的校驗演算法有奇偶校驗和crc校驗,這2種校驗並沒有抗資料篡改的能力,它們一定程度上能檢測並糾正資料傳輸中的通道誤碼,但卻不能防止對資料的惡意破壞。
md5 hash演算法的"數字指紋"特性,使它成為目前應用最廣泛的一種檔案完整性校驗和(checksum)演算法,不少unix系統有提供計算md5 checksum的命令。
2)數字簽名
hash 演算法也是現代密碼體系中的乙個重要組成部分。由於非對稱演算法的運算速度較慢,所以在數字簽名協議中,單向雜湊函式扮演了乙個重要的角色。對 hash 值,又稱"數字摘要"進行數字簽名,在統計上可以認為與對檔案本身進行數字簽名是等效的。
而且這樣的協議還有其他的優點。
3)鑑權協議
如下的鑑權協議又被稱作"挑戰--認證模式:在傳輸通道是可被偵聽,但不可被篡改的情況下,這是一種簡單而安全的方法。
4樓:匿名使用者
hash函式 hash,一般翻譯做"雜湊",也有直接音譯為"雜湊"的,就是把任意長度的輸入(又叫做預對映, pre-image),通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,而不可能從雜湊值來唯一的確定輸入值。
簡單的說就是一種將任意長度的訊息壓縮到某一固定長度的訊息摘要的函式。
hash主要用於資訊保安領域中加密演算法,他把一些不同長度的資訊轉化成雜亂的128位的編碼裡,叫做hash值. 也可以說,hash就是找到一種資料內容和資料存放位址之間的對映關係
了解了hash基本定義,就不能不提到一些著名的hash演算法,md5 和 sha1 可以說是目前應用最廣泛的hash演算法,而它們都是以 md4 為基礎設計的。那麼他們都是什麼意思呢?
這裡簡單說一下:
1) md4
md4(rfc 1320)是 mit 的 ronald l. rivest 在 1990 年設計的,md 是 message digest 的縮寫。它適用在32位字長的處理器上用高速軟體實現--它是基於 32 位運算元的位操作來實現的。
2) md5
md5(rfc 1321)是 rivest 於2023年對md4的改進版本。它對輸入仍以512位分組,其輸出是4個32位字的級聯,與 md4 相同。md5比md4來得複雜,並且速度較之要慢一點,但更安全,在抗分析和抗差分方面表現更好
3) sha1 及其他
sha1是由nist nsa設計為同dsa一起使用的,它對長度小於264的輸入,產生長度為160bit的雜湊值,因此抗窮舉(brute-force)性更好。sha-1 設計時基於和md4相同原理,並且模仿了該演算法。
那麼這些hash演算法到底有什麼用呢?
hash演算法在資訊保安方面的應用主要體現在以下的3個方面:
1) 檔案校驗
我們比較熟悉的校驗演算法有奇偶校驗和crc校驗,這2種校驗並沒有抗資料篡改的能力,它們一定程度上能檢測並糾正資料傳輸中的通道誤碼,但卻不能防止對資料的惡意破壞。
md5 hash演算法的"數字指紋"特性,使它成為目前應用最廣泛的一種檔案完整性校驗和(checksum)演算法,不少unix系統有提供計算md5 checksum的命令。
2) 數字簽名
hash 演算法也是現代密碼體系中的乙個重要組成部分。由於非對稱演算法的運算速度較慢,所以在數字簽名協議中,單向雜湊函式扮演了乙個重要的角色。 對 hash 值,又稱"數字摘要"進行數字簽名,在統計上可以認為與對檔案本身進行數字簽名是等效的。
而且這樣的協議還有其他的優點。
3) 鑑權協議
如下的鑑權協議又被稱作"挑戰--認證模式:在傳輸通道是可被偵聽,但不可被篡改的情況下,這是一種簡單而安全的方法。
hash函式在程式設計中的實現
// 說明:hash函式(即雜湊函式)在程式設計中的應用目標 ------ 把乙個物件通過某種轉換機制對應到乙個
// size_t型別(即unsigned long)的整型值。
// 而應用hash函式的領域主要是 hash表(應用非常廣)、密碼等領域。
// 實現說明:
// (1)、這裡使用了函式物件以及泛型技術,使得對所有型別的物件(關鍵字)都適用。
// (2)、常用型別有對應的偏特化,比如string、char*、各種整形等。
// (3)、版本可擴充套件,如果你對某種型別有特殊的需要,可以在後面實現專門化。
// (4)、以下實現一般放在標頭檔案中,任何包含它的都可使用hash函式物件。
#include
using std::string;
inline size_t hash_str( const char* s )
template
struct hash
;// 一般的物件,比如:vector< queue>的物件,需要強制轉化
template < class key >
size_t hash::operator () ( const key& k ) const
return res;
}// 偏特化
template<>
size_t hash< string >::operator () ( const string& str ) const
typedef char* pchar;
template<>
size_t hash::operator () ( const pchar& s ) const
typedef const char* pcchar;
template<>
size_t hash::operator () ( const pcchar& s ) const
template<> size_t hash::operator () ( const char& x ) const
template<> size_t hash::operator () ( const unsigned char& x ) const
template<> size_t hash::operator () ( const signed char& x ) const
template<> size_t hash::operator () ( const short& x ) const
template<> size_t hash::operator () ( const unsigned short& x ) const
template<> size_t hash::operator () ( const int& x ) const
template<> size_t hash::operator () ( const unsigned int& x ) const
template<> size_t hash::operator () ( const long& x ) const
template<> size_t hash::operator () ( const unsigned long& x ) const
// 使用說明:
// // (1)、使用時首先由於是泛型,所以要加上關鍵字型別。
// // (2)、其次要有乙個函式物件,可以臨時、區域性、全域性的,只要在作用域就可以。
// // (3)、應用函式物件作用於對應型別的物件。
//----------------------- hash函式使用舉例 -------------------------
#include
#include
#include
using namespace std;
int main()
函式的基本性質有哪些,hash函式有哪些性質?
定義域,值域,單調性,奇偶性,週期性。通常函式考試的基本內容都在這幾個方面出題。hash函式有哪些性質?hash,一般翻譯做 雜湊 也有直接音譯為 雜湊 的 就是把任意長度的輸入 又叫做預對映,pre image 通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是...
什麼是雜湊hash演算法,什麼叫雜湊演算法
nix系系統 es unix 例子 ivs7aet4nzqpm 說明 linux或者其他linux核心系統中 長度 13 個字元 描述 第1 2位為salt,例子中的 iv 位salt,後面的為hash值 系統 md5 unix 例子 1 12345678 xm4p rkbgknntaqg9p0t ...
為什麼重寫equals時必須重寫hashCode方法
如果你過載了equals,比如說是基於物件的內容實現的,而保留hashcode的實現不變,那麼很可能某兩個物件明明是 相等 而hashcode卻不一樣。這樣,當你用其中的乙個作為鍵儲存到hashmap hasotable或hashset中,再以 相等的 找另乙個作為鍵值去查詢他們的時候,則根本找不到...