回覆列表
  • 1 # keep68319

    雜湊函式

    它們提供任意長度輸入和(通常)固定長度(或較小長度)輸出之間的對映 . 它可以是從簡單的crc32到完整的加密雜湊函式,如MD5或SHA1 / 2/256/512 . 重點是正在進行單向對映 . 它總是很多:1對映(意味著總會有碰撞),因為每個函式產生的輸出都比輸入能力小(如果你將每個可能的1mb檔案輸入到MD5中,你會得到大量的碰撞) .


    他們很難(或實際上不可能)扭轉的原因是因為他們在內部的工作方式 . 大多數加密雜湊函式多次迭代輸入集以產生輸出 . 因此,如果我們檢視每個固定長度的輸入塊(這取決於演算法),雜湊函式將呼叫當前狀態 . 然後它將遍歷狀態並將其更改為新狀態並將其用作自身的反饋(MD5為每個512位資料塊執行64次此操作) . 然後它以某種方式將來自所有這些迭代的結果狀態組合在一起以形成結果雜湊 .


    現在,如果你想解碼雜湊,你需要為每個狀態反轉迭代 . 現在,為了解釋為什麼這很難,想象一下從下面的公式中推斷 a 和 b : 10 = a + b . a 和 b 有10種正面組合可以使用 . 現在迴圈多次: tmp = a + b; a = b; b = tmp . 對於64次迭代,你只是一個簡單的加法,其中一些狀態從迭代到迭代保留 . 實際雜湊函式執行的操作多於1次(MD5對4個狀態變數執行大約15次操作) . 並且由於下一次迭代取決於前一次的狀態,而前一次迭代在建立當前狀態時被破壞,如果您對輸入的大小有所瞭解,那麼它實際上要大大降低雜湊強制雜湊值(對於較小的輸入)而不是甚至嘗試解碼雜湊 .


    加密功能

    它們在任意長度的輸入和輸出之間提供1:1對映 . 而且他們總是可逆的 . 需要注意的重要一點是,使用某種方法是可逆的 . 對於給定的金鑰,它總是1:1 . 現在,有多個輸入:金鑰對可能會生成相同的輸出(實際上通常有,具體取決於加密函式) . 良好的加密資料與隨機噪聲無法區分 . 這與良好的雜湊輸出不同,雜湊輸出始終是一致的格式 .


    用例

    如果要比較值但不能儲存普通表示(出於多種原因),請使用雜湊函式 . 密碼應該非常適合這種用例,因為出於安全原因(不應該),您不希望將它們儲存為純文字 . 但是如果你想檢查一個檔案系統是否有盜版音樂檔案怎麼辦?每個音樂檔案儲存3 MB是不切實際的 . 所以相反,取出檔案的雜湊值並存儲(md5將儲存16個位元組而不是3mb) . 這樣,你只需雜湊每個檔案並與儲存的雜湊資料庫進行比較(由於重新編碼,更改檔案頭等等,這在實踐中不起作用,但這是一個用例示例) .


    當你設計它們時,使用雜湊函式 . 如果您有2個輸入,並想要檢查它們是否相同,則透過雜湊函式執行 . 對於小輸入大小,碰撞的機率是天文數字低(假設具有良好的雜湊函式) . 那個's why it'建議用於密碼 . 對於最多32個字元的密碼,md5的輸出空間是4倍 . SHA1的輸出空間是大約6倍(大約) . SHA512的輸出空間約為16倍 . 你真的不在乎密碼是什麼,你關心它是否應該使用雜湊密碼 .


    無論何時需要取回輸入資料,都要使用加密 . 注意單詞 need . 如果你想要將它們儲存為純文字 . 因此,儲存加密版本並儘可能保持金鑰安全 .


    雜湊函式也非常適合簽名資料 . 例如,如果您正在使用HMAC,則透過獲取與已知但未傳輸的值(秘密值)連線的資料的雜湊值來簽署一條資料 . 因此,您傳送純文字和HMAC雜湊 . 然後,接收器簡單使用已知值雜湊提交的資料,並檢查它是否與傳輸的HMAC匹配 . 如果它是相同的,你知道它沒有被沒有秘密值的一方篡改 . 這通常用於HTTP框架的安全cookie系統,以及HTTP上資料的訊息傳輸,您希望在資料中保證完整性 .


    關於密碼雜湊的註釋:

    加密雜湊函式的一個關鍵特性是它們應該非常快速地建立,並且很難/慢速地反轉(以至於它實際上是不可能的) . 這會造成密碼問題 . 如果儲存 sha512(password) ,則攻擊者只需透過雜湊函式執行字典並測試每個結果即可 .


    新增鹽有助於解決問題,因為它會向雜湊新增一些未知資料 . 因此,他們不需要找到與 md5(foo) 相匹配的任何東西,而是需要找到一些東西,當新增到已知的鹽中時會產生 md5(foo.salt) (這是非常難做的) . 但它仍然沒有透過執行字典的問題 .

  • 中秋節和大豐收的關聯?
  • 硫磺皂能不能天天用呢?