雜湊演算法及其拓展

2021-09-29 01:16:59 字數 2913 閱讀 6472

本篇是ios逆向開發的遞進篇-關於雜湊演算法、數字簽名及對稱加密等,下面我們著重講解此內容,希望對大家有所幫助!!!

雜湊表也稱為雜湊表(hash table),是根據關鍵碼值(key,value),直接進行訪問的資料結構。通過把關鍵碼對映到表中的乙個位置來進行訪問記錄,用來加快查詢速度。對映函式也稱之為雜湊函式,存放記錄陣列稱為雜湊表。

假設沒有記憶體限制,直接可以將鍵作為陣列的索引,那麼所有的查詢僅僅需要一次即可完成。但是這種理想的情況也不會一直出現,因為牽扯到記憶體問題。從另乙個角度來說,如果沒有時間來限制,我們也可以使用無序陣列並進行順序查詢,這樣也會使用較少的記憶體。

使用雜湊查詢演算法分為兩個步驟:

使用hash函式將被要查詢的鍵轉化為陣列中的乙個索引。理想情況下,不同的鍵都可以轉為不同的索引值。但這僅僅是理想情況下,在實際的開發運算中,我們還是要處理兩個或者多個鍵值雜湊到同個索引值的情況。

要處理碰撞衝突的過程。

目前本人部落格關於講述雜湊思想查詢元素的部落格有:還會持續更新此類演算法思想有關的題目。

拉鍊法簡單說就是鍊錶+陣列。將鍵來通過hash函式對映為大小為m的陣列下標索引,陣列的每個元素指向鍊錶,鍊錶的每個節點儲存著雜湊出來的索引值為節點下標的鍵對值。

舉乙個例子:

給定一組資料為,假設雜湊表長度為13,用拉鍊法解決構造的雜湊表。拉鍊法表示如下:

上面就是拉鍊法的圖示,下面我們講解拉鍊法的**實現:

public

class separatechaininghashst

public separatechaininghashst(int

m) }

private

inthash(key key)

public value get

(key key)

public

void

put(key key, value val)

public

void

delete(key key)

public iterablekeys()

system.

out.println();

}return

queue;

}public

static

void

main(string args)

for(string s : st.keys())

stdout.println(s + "

" + st.get

(s));

st.delete("m

");stdout.println(

"*************************************");

for(string s : st.keys()) }}

上面就是拉鍊表的基本內容,如果想進一步了解,可以檢視資料結構相關書籍。

開放定址法包括線性探測法和平方探測法。

1.4.1.1 直接使用md5加密

//

密碼 nsstring * pwd = @"

123456";

//md5 直接加密 e10adc3949ba59abbe56e057f20f883e

//不足:不夠安全了。可以反查詢!

pwd = pwd.md5string;

我們也可以通過終端,通過輸入md5 -s "內容",如下得到md5,32個字元

1.4.1.2 加鹽

//

足夠複雜!

static nsstring * salt = @"

(*(*(ds*yfhiuyf(*&dsfhus(*ad&";

運用加鹽方式弊端: 鹽都是是固定的,把它寫死在程式裡面,一旦洩露就會不安全了!

1.4.1.3 hmac

/** hmac

* 使用乙個金鑰加密,並且做兩次雜湊!

* 在實際開發中,金鑰(key)來自於伺服器(動態的)!

* 乙個賬號,對應乙個key,而且還可以跟新!

*/pwd = [pwd hmacmd5stringwithkey:@"

hank

"];

在我們日常開發中,如果乙個是有非常好的後台開發素質,會在登入註冊介面返回來乙個時間戳,對於這個時間戳可以很好地運用到hmac中

通過上面:

假如將時間戳運用到裡面中,和hmac雜湊值拼接此時的時間戳(直到分,不到秒)發給伺服器,然後伺服器根據客戶端發來的字元,進行解析;如果此時這個過程到了下一分鐘(201812032050 58s發,伺服器收到已經201812032051 20s ),伺服器會做乙個分鐘-1進行驗證

我們在搜尋幾個詞語時,假如在

資料庫檢索「國孩」,「真的」,「很帥」,對於我們搜尋其中的任何乙個詞,都可以通過雜湊檢索出來,雜湊內部是怎麼做到的呢?

下面是三個詞在md5下的32位字元值:

雜湊通過將「國孩」,「真的」,「很帥」的雜湊值進行想加,得到了也是乙個32位字串

對於很多原始檔上傳至某個平台上時,該平台會給原始檔設定唯一乙個雜湊值,如果有盜版上傳至該平台,會被拒絕

數字簽名是對原始資料的hash值,用非對稱rsa加密

明文資料和hash值如果通過直接傳遞就會有篡改的風險,因此我們要對資料加密。但是明文資料是比較大的,不太適合運用rsa非對稱加密,那麼資料的hash值是比較小,這個資料如果用來校驗,這樣就完全可以使用rsa進行加密。當我們在資料傳遞的時候,可以通過將明文資料+rsa加密的校驗資料一起傳送給對方,rsa加密的校驗資料,稱之為簽名。

下面我們來講述一下數字簽名驗證的過程:當對方拿到資料之後,如何驗證呢?

上面是過程,下面有乙份**:

對稱加密就是明文通過金鑰得到密文,然後密文通過金鑰解密得到明文。

常見演算法:

應用模式如下**:

雜湊演算法及其應用場景

雜湊演算法的概念和特性 我們前面分享了雜湊表 雜湊函式和雜湊衝突,其實也可以譯作雜湊表 雜湊函式和雜湊衝突,是乙個意思。雜湊演算法簡單理解就是實現前面提到的雜湊函式的演算法,用於將任意長度的二進位制值串對映為固定長度的二進位制值串,對映之後得到的二進位制值就是雜湊值 雜湊值 我們日常開發中最常見的雜...

資料型別及其拓展

1.整數拓展 進製 int i 10 十進位制 int i2 0b111 二進位制 int i3 010 八進位制 int i4 0x10 十六進製制 0 9 a f system.out.println i system.out.println i2 system.out.println i3 s...

雜湊演算法的理論及其相關知識

一 概念 雜湊表 hash 也叫雜湊查詢表,是一種重要的查詢技術,因使用雜湊函式 雜湊函式 而得名,利用雜湊函式對映雜湊位址,得到的儲存錶即為雜湊表。雜湊技術 一種基於盡可能不通過比較操作而直接得到記錄的儲存位置的想法而提出的一種特殊查詢方法。二 基本思想 通過記錄中關鍵字的值key為自變數,通過一...