讀軟體開發安全之道:概念、設計與實施07密碼學(上)

躺柒發表於2024-08-24

1. 加密工具

1.1. 加密工具之所以沒有得到充分使用,就是因為人們往往認為密碼學是一個准入門檻極高的專業領域

1.2. 如今的加密學大部分都源自純數學,所以只要能夠正確使用,加密學確實行之有效

  • 1.2.1. 不代表這些演算法本身確實無法破解,而是需要數學領域出現重大突破才能實現破解

1.3. 密碼學可以提供一系列安全工具,但是要想讓密碼產生效果,就必須謹慎使用加密功能

  • 1.3.1. 可以依靠高質量的程式碼庫來提供完整的解決方案

2. 隨機數

2.1. random number

2.2. 可以充當填充或者自動生成的數值,前提是這個數值必須是不可預測的

2.3. 單從安全的角度上看,我們可以認為隨機數最重要的屬性就是不可預測性

2.4. 必須防止攻擊者準確地猜出密碼,那麼不可預測性就是至關重要的,因為能夠被預測到的密碼都是弱密碼

2.5. 隨機數的應用包括認證、雜湊計算、加密和金鑰生成,這些功能都依賴不可預測性

2.6. 偽隨機數

  • 2.6.1. Pseudorandom Number Generator,PRNG

  • 2.6.2. 會使用確定性計算來生成看似無窮無盡的隨機數序列

  • 2.6.3. 生成的結果可以輕而易舉地超出人類的模式檢測能力,但分析和對抗軟體卻有可能輕鬆學會模仿某個PRNG

  • 2.6.4. 鑑於這類軟體實際上還是可預測的,所以在安全的環境中不應該使用這類軟體

  • 2.6.5. 鑑於計算偽隨機數的過程非常快,它們還是非常適合於大量非安全用途

  • 2.6.5.1. 蒙特卡羅模擬

  • 2.6.5.2. 隨機分配變體網頁設計來執行A/B測試(拆分測試)

  • 2.6.5.3. 即使有人預測出了演算法(這種情況的可能性不高)​,他們也不可能造成任何實際的威脅

  • 2.6.6. π

  • 2.6.6.1. π的數位符合統計學上的正態分佈,在一般意義上也是完全隨機的

  • 2.6.6.2. 在另一方面,π不僅很容易計算,而且廣為人知,所以這個序列就完全屬於可預測的數列,它也就不再安全了

2.7. 加密安全的偽隨機數

  • 2.7.1. Cryptographically Secure Pseudorandom Number Generator,CSPRNG

  • 2.7.1.1. “C”​,這個字母表示這個數足夠安全,可以用於加密

  • 2.7.1.2. 包含“偽”這個字眼兒,是承認這種隨機數可能同樣不具備完美的隨機性,但是專家們都認為這樣的隨機數擁有足夠強大的不可預測性,所以無論用在什麼場合中都是安全的

  • 2.7.2. 如果我們對安全性的要求比較高,就應該使用這種型別的隨機數

  • 2.7.3. 只要我們認為隨機數值可以預測就會削弱系統的安全性,就應該使用CSPRNG

  • 2.7.4. 從定義上看,徹底隨機的資料本身就不可能透過演算法來實現,而是需要透過不可預測的物理程序來產生

  • 2.7.4.1. 蓋革計時器可能就屬於這樣的硬體隨機數生成器(Hardware Random Number Generator,HRNG)

  • 2.7.4.2. 它也被稱為熵源(entropy source),因為放射性衰變事件的發生是隨機的

  • 2.7.5. 軟體也可以生成熵

  • 2.7.5.1. 一般來說,軟體生成的熵來自硬碟訪問、鍵盤和滑鼠輸入事件、網路傳輸等需要與外部實體進行復雜互動的操作

  • 2.7.6. 熵源需要一定時間來生成隨機數

  • 2.7.6.1. 如果我們要求生成的隨機數既多又快,CSPRNG就會變得非常緩慢

  • 2.7.6.2. 這就是生成安全隨機數的代價

3. 訊息摘要

3.1. message digest

  • 3.1.1. 也稱為雜湊值

3.2. 訊息摘要(message digest)或雜湊函式可以充當資料的指紋,前提是不同的輸入不會產生相同的輸出(即產生碰撞)​

3.3. 是一段使用單向函式從訊息中計算出來的固定長度的數值

  • 3.3.1. 每段訊息都有專門的摘要值,只要訊息本身進行了修改,摘要值也一定會產生變化

  • 3.3.2. 單向也是一個重要的屬性,因為單向表示摘要計算是不可逆的,所以攻擊者就不可能發現不同的訊息正好計算出相同的摘要值

  • 3.3.3. 只要我們發現摘要值是匹配的,就表示訊息的內容也沒有遭到篡改

3.4. 如果兩個不同的訊息產生了相同的摘要值,我們稱之為一次碰撞(collision)

3.5. 如果攻擊者發現了兩個不同的輸出可以生成相同的摘要值,就代表他/她發起了一次成功的碰撞攻擊(collision attack)

  • 3.5.1. 摘要函式最讓人絕望的攻擊莫過於原像攻擊(preimage attack),即只要攻擊者知道了摘要值,他/她就可以找到生成這個摘要值的輸入資訊

3.6. 加密安全的摘要演算法是強大的單向函式,它可以把碰撞的可能性降到非常低,低到我們可以認為碰撞根本不可能發生

  • 3.6.1. 如果我們希望利用摘要,這個前提必不可少,因為這個前提意味著我們可以透過比較訊息的摘要值來比較完整的訊息

3.7. 使用加密的雜湊函式

  • 3.7.1. 這種函式會用額外的金鑰引數來對摘要的計算進行轉換

  • 3.7.2. 這些函式也稱為訊息認證碼(Message Authentication Code,MAC)

  • 3.7.2.1. 只要雜湊函式的金鑰還是保密的,攻擊者就無法偽造這些金鑰

  • 3.7.2.2. MAC通常用來防止攻擊者對資料進行篡改

3.8. 重放攻擊

  • 3.8.1. 安全通訊協議也需要解決重放攻擊的問題

  • 3.8.2. 存在這個問題並不代表加密方式很弱,而是代表加密方式的使用方法不對

  • 3.8.3. 產生這個問題的根源在於,攻擊者傳送的訊息和訂購3個零件的真實訊息是一模一樣的,所以從本質上看,這還是一個可預測的問題

3.9. 安全MAC通訊

  • 3.9.1. 需要保證訊息是唯一的,而且是不可預測的

  • 3.9.2. 一種簡單的解決方法是讓Alice在訊息中包含一個時間戳,這樣Bob就可以直接忽略那些時間戳已經過期的訊息

  • 3.9.3. 如果訊息的傳送頻率很高,或者網路的延遲比較嚴重,那麼時間戳就不太容易正常工作

  • 3.9.4. 針對重放攻擊,一種更安全的解決方案是在Alice傳送每條訊息之前,讓Bob先給Alice傳送一個隨機數(一次性的隨機值)​

  • 3.9.4.1. Alice可以在傳送的訊息中攜帶Bob的隨機值,同時也在訊息中攜帶訊息的MAC值

  • 3.9.4.2. 這樣就可以避免重放攻擊,因為每次訊息的隨機值都會發生變化

  • 3.9.4.3. Mallory可以截獲訊息,修改Bob傳送的隨機值,但是如果隨機值發生了變化,Bob馬上就會發現

  • 3.9.5. 訊息本身很短

  • 3.9.5.1. 即使沒有重放攻擊,很短的訊息也是暴力破解攻擊的物件

  • 3.9.5.2. 計算加密雜湊函式所需要的時間往往和訊息資料的長度成正比

  • 3.9.5.3. 如果訊息沒有達到最小長度,我們可以用隨機位來填充訊息,這樣就可以緩解短訊息的問題了

  • 3.9.5.4. 對那些比較長的訊息計算MAC值,所需時間也比較長,但是這也讓Mallory實現暴力破解的時間大幅增加,直至她無法完成暴力破解,所以仍然物有所值

  • 3.9.5.5. 願意付出雜湊函式計算的成本

  • 3.9.5.6. 我們也應該透過填充隨機位(而不是可以預測出來的偽隨機數)讓Mallory發起攻擊的難度越來越大

相關文章