區塊鏈重要基礎知識2——哈希函數的原理以及應用

  • 對於以中心化的中央銀行來說需要做到防止篡改功能,那麼其中場景就是中央銀行控制供給,並加上防僞標識,但是依舊有人僞造,這時候再加上執法機構進行互補,對僞造的人給予一定的懲罰
  • 但是分佈式沒有中心處理中心就要通過密碼原理進行防止篡改,於是就有了哈希函數,同時防篡改也是哈希函數最重要的功能

哈希函數

1.特性[1]

1.1三個特性:

  1. 輸入可爲任意大小的字符串。

  2. 它產生固定大小的輸出。爲使本章討論更具體,我們假設輸出值大小爲256位,但是,我們的討論適用於任意規模的輸出,只要其足夠大。

  3. 它能進行有效計算,簡單來說就是對於特定的輸入字符串,在合理時間內,我們可以算出哈希函數的輸出。更準確地說,對應n位的字符串,其哈希值計算的複雜度爲O(n)。

1.2 由於安全附加的幾個特性:

  1. 碰撞阻力(collision-resistance);

    1. 找不到兩個不同的值去映射到同一個值,無法將其產生碰撞,這就是常說的碰撞阻力;

    2. 圖示如下:

      碰撞阻力.png

    3. 注意到一個問題就是:雖然說有很多種情況,但是在有一些特殊方法之下就可能使得碰撞機率大大增大,最後完成碰撞;其中計算碰撞的概率有個很經典的理論:

      1. 生日悖論:

        1. 定義:某個班級裏一共有 23 名學生。不考慮雙胞胎、閏年等特殊情況,在這些男孩女孩中間,有 2 個人生日相同的概率是多少?

          1. 答:實際發生的概率要高達50.7%。
        2. 悖論所悖之處:

          1. 直覺上:我們會覺得發生的概念很小,畢竟一年有365天
          2. 實際上:實際上發生的概念很大,這主要是因爲我們直覺和實際客觀看待這個事情的出發點是不一樣的——所以我們在計算的時候就會相比客觀漏掉了很多
            1. 從我們自身去看,我們需要尋找的是與自己生日相同的人;
            2. 從客觀來看,需要找到的只要是任意兩個生日相同的人便是。
        3. 如何計算同年同月生的概率呢?

          1. 答:=()\frac{生日相同的組合個數}{所有組合個數}=\frac{(所有組合個數-不同的組合個數)}{所有組合個數}365364363365365365=0.0082\frac{{365 \cdot 364 \cdot 363}}{{365 \cdot 365 \cdot 365}}=0.0082
        4. 我們經過總結:

          1. 一個人的生日一共有365 種可能。我們可以把這個問題寫成一般形式,即在有n 種可能的情形下,要使至少有2人生日相同的概率達到50%,需要有如下的樣本人數:
            • 1.18n1.18\sqrt n
            • 對應到式子中就是
              1. (365天就是365種可能):1.18365=22.5...1.18\sqrt {365}=22.5...
              2. (12個月就是12種可能):1.1812=4.0876...1.18\sqrt {12} =4.0876...
                • 也就是說,當樣本人數大於等於5 時,存在相同出生月份的概率就將超過50%
        5. 實際應用場景:

          1. 生物識別的精確度:

            1. 衡量該精度的指標是錯誤接受率(False Acceptance Rate,簡稱FAR,也叫認假率)——也就是把他人的、不應該匹配的生物特徵信息當成與用戶本人匹配的信息。

            2. 帶來的問題:雖然說生物識別精度很高,但是他們的總數實際上是一定的,那麼雖然入庫的人數不斷增加,這就對應到一個班級的人數不斷增加,那麼自然產生相同的信息的人可能性就會更大,如下圖所示:

              錯誤接收發生概率上升的機制

              • 同樣我們在DNA鑑定的時候一樣會發生這樣的事情,遇到同樣的困難,並且有時候即使保證了理論上的很大概率不重合,但是我們需要知道概率和頻率的區別——也就是即使是再少的概率也是可能發生,
                • 需要注意的一點就是:一旦出現DNA相同的事情但是人們認爲DNA是不可能相同的話那就是可能導致很大的矛盾
                • 可能發生的場景:在美國的馬里蘭州,截至2007 年1 月,該州的DNA 數據庫共收錄了大約3 萬人的信息。這個數字比256 萬整整少了2 位數。但即使這樣,實際上該地區也出現了不同人的DNA 被判定爲一致的事件20。
            3. 不發生錯誤的概率公式:(1p)n(n1)2{(1 - p)^{\frac{{n(n - 1)}}{2}}}

        6. 世界上沒有哈希函數具有防碰撞特性。我們實踐中依賴的加密的哈希函數僅僅是人們經過不懈努力之後暫未成功找到碰撞的函數。

          1. MD5MD5:最終找到碰撞,使之慢慢在使用中被淘汰
        7. 作用:

          1. 當需要下載一個碩大的文件的時候,下載下來如何覈對信息是否準備是我們面臨的問題
            1. 答:通過覈對hash摘要信息,由於碰撞原理的原因,使得在不發生碰撞的情況下我們不用去核對那碩大的文件,只需要對固定長度的hash信息進行比對就行。
  2. 隱祕性(hiding);

    1. 解釋:我們僅僅知道hash函數的輸出,但是沒有一個可行的方法去算出來,也就是相當於把hash函數當成一個小黑盒子;

    2. 意義:在你知道結果的情況,無法反向求出輸入的是什麼

    3. 當其輸入rr選自一個高階最小熵(high min-entroy)的概率分佈,在給定H(rllx)H(rllx)條件下來確定xx是不可行的。

      1. 高階最小熵[2]
        1. 很大的時候:
          1. 如果r是從長度爲256位的字符串中隨意選出的,那麼任意特定字符串被選中的概率爲1/2 256 ,這是一個小到幾乎可以忽略的取值;
          2. 讓r這個隨機變量是通過一個即使在“最保守”的情況下也有“很多”可能性,高度混亂,高度隨機的系統中選取。
        2. 很小的時候:當我們進行設置密碼的時候,通常設置自己生日相關這樣會比較好記
    4. 實現:

      1. 承諾:

        裝進
        放上面
        數字
        信封
        桌子上
        承諾:過程開始
        承諾:過程結束
        打開信封前
        打開信封后
        對其他人來說它還是祕密
        展現所承諾的數值
        1. 算法實現:

          信息msg
          臨時隨機數nonce
          承諾com
          確認程序verify
          對比com與輸入msg和nonce計算得到的com是否一致
          真true
          否false
        2. 要求的特性:

          1. 隱祕性:已知comcom,沒有可行的方法找到msgmsg。——同時也是這一小節所需要給的定義在這裏總結出來。
            • 定義:當其輸入rr選自一個高階最小熵(high min-entroy)的概率分佈,在給定HrllxH(rllx)條件下來確定是不xx可行的。
            • 更像是平時我們需要中間人,只有通過中間人才能得到相應的信息,別人即使知道你承諾了這個東西,但是具體卻不知道承諾的內容;
          2. 約束性:沒有可行的辦法找到兩組msgnonce(msg,nonce)msgnonce(msg',nonce')msgmsgmsg \ne msg,而commitmsgnonce==commitmsgnoncecommit(msg,nonce)==commit(msg',nonce')
            • 對於所承諾的東西,這裏面的信息你是不能找到其他信息去替代他的;
        3. 具體實施:

          1. 承諾的隱蔽性正好是hash的隱蔽性;
          2. 承諾的約束性也正好與hash的碰撞對應;
          3. 所以結合1和2,我們正好把hash函數作爲承諾的實現
  3. 謎題友好(puzzle-friendliness):區塊鏈中尤其需要,但是其他哈希函數使用到的場景卻不一定需要

    1. 定義:
      1. 如果對於任意nn位輸出值yy,假定k選自高階最小熵分佈,如果無法找到一個可行的方法,在比2n2^n小很多時間內找到xx,保證Hkx=yH(k||x)=y成立,那麼我們稱哈希函數HH爲謎題友好;
      2. 集合Y並不是固定的,而是在一個集合範圍,所以需要考慮的是這個集合的個數。由於輸出是一個集合,那麼只要找到其中一個就可以解決問題,但是如果這個集合是最小集合於是就變成需要遍歷nn個值。
    2. 解釋:
      • 如果有一個人想找到y值所對應的輸入,假定在輸入集合中,有一部分是非常隨機的,那麼他將非常難以求得y值對應的輸入。
    3. 與隱祕性的區別:隱祕性是針對於輸入輸出的單個x、y,而謎題友好是針對於輸入輸出的集合來說的。
    4. 區塊鏈應用這一特性在挖礦中。

2.哈希函數在區塊鏈中的應用[3]

比特幣中大量使用SHA256SHA-256(Secure Hash Algorithm 256)哈希函數,並且效果還很好。

爲了讓hash函數能夠接受各個長度的數字的方法:通過一般方法,就可以將接受固定長度的哈希函數轉化爲可接受任意長度輸入的哈希函數,我們稱這個轉換過程爲MDMD(Merkle-Damgard)變換,過程如下圖所示:

MD壓縮函數.png

首先將信息分爲多個區塊,每段區塊等長(不夠長度的可以在最開始前面補0),利用初始向量依次與所分區塊進行計算得到固定長度數,每次將上一次計算結果加入本次計算中並與信息區塊進行計算。通過這樣的一系列計算使得無論多長的數都能得到固定長度的數目——也就是用時間的代價最後換來固定長度的摘要。

注意:

  • 需要注意的是並不是前面所講的hash函數特性在每一個應用場景都會使用到,都是有選擇性的使用。比如:第三個特性謎題友好一般就只是在區塊鏈中使用。

2.1 hash指針及其結構

hash指針與普通指針的區別:

  • hash指針指向數據存儲位置及其位置數據的哈希值的指針,不僅有位置指向而且還能保證沒有被篡改過
    • 注意:H()H(指針)表示有位置的指向並且防篡改,就相當於hash+指針(可以把它當成這樣的結構體)

hash指針.png

通過hash指針構建一個鏈表,我們將這個數據結構稱爲區塊鏈(block chain)。其結構如下圖所示——區塊鏈的定義

區塊鏈.png

所以hash指針特別適合放篡改這一應用,比如應用在日誌的防篡改。

那麼像區塊鏈這樣一種結構,如果我們想要進行篡改是如何的一種情況呢?

  • 答:如果你想要篡改某一節點的值,那麼在更改當前節點之後勢必就要跟隨着更改下一節點,因爲當前節點與上下相鄰節點都是相連接的。所以最後肯定會追溯到第一個節點,只要將第一個節點更改然後接着的跟隨更改,這樣就能進行篡改,那麼防止篡改也是一樣,將第一個節點放在一個不能篡改的地方。
    • 與MD(SHA-256算法主要生成思想)一樣,首要節點很重要,得保護好。

2.1.1 hash指針的應用

梅克爾樹:

理解:通過在一個節點中建立兩個hash指針構成樹的左右節點。

詳細結構

  • 在梅克爾樹的數據結構中,所有的數據區塊都被兩兩分組,指向這些數據區塊的指針被存儲在上一層的父節點(parent node)中,而這些父節點再次被兩兩分組,並且指向父節點的指針被存情在上一層的父節點中,一直持續這個過程,直到最後我們到達樹的根節點。

結構圖示如下

默克爾樹.png

通過默克爾樹進行隸屬或者非隸屬的證明:

  • 驗證實例如下:

    • 主要過程:假設我們要驗證區塊中存在Hash值爲9Dog:64(綠色框)的交易,我們僅需要知道1FXq:18、ec20、8f74(黃色框)即可計算出781a、5c71與Root節點(藕粉色框)的哈希

    • 圖示:

      隸屬證明實例
  • 所以如果整棵樹上有nn個節點,只需要展示約log2nlog_2(n)個項目,因爲每個步驟僅需要計算子區塊的哈希值,驗證過程需要時間約爲log2nlog_2(n)。——我們可以從上圖看到每次驗證只需要知道同層次未知相鄰的部分就行

參考文章

1.生日悖論

2.高階最小熵的理解知乎

3.解讀區塊鏈全套六冊.第四章.第四節

4.SHA-256算法實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章