大兔的神密世界
  • search
  • apps
  • Jan 27, 2018
    ·
    2 min read
    課堂
    sha1、hash 雜湊
    ┤課前廢話├─────────────────────────────────

      最近正好需要用到雜湊

      原本已經稍微忘記這些東西

      趕緊查完資料做筆記

    ┤課前簡介├─────────────────────────────────

      什麼是SHA雜湊?

      安全雜湊演算法(英語:Secure Hash Algorithm,縮寫為SHA)是一個密碼雜湊函式家
    族,是FIPS(聯邦資訊處理標準 Federal Information Processing Standards,是美國聯
    邦政府制定給所有軍事機構除外的政府機構及政府的承包商所使用的公開標準。)所認證的
    安全雜湊演算法。

      SHA家族的演算法,由美國國家安全局(NSA)所設計,並由美國國家標準與技術研究
    院(NIST)發布,是美國的政府標準,其分別是:SHA-0(1993年發布)、SHA-1(1995年
    發布)、SHA-2(2001年發布)、SHA-3(2015年正式發布)。

    僅節錄部分內容,詳細可參考維基百科:
    https://zh.wikipedia.org/wiki/SHA%E5%AE%B6%E6%97%8F

    ┤課程簡介├─────────────────────────────────

      PHP針對演算法有制定了md5()、sha1()...等函式,但隨著雜湊演算法越來越多,PHP把
    所有的雜湊(hash)演算都整合成一個函式:hash(),直接在函式中指定要用哪個演算法。

      本次課程會先講解md5()、sha1()兩種函式,接著介紹hash()。

    ┤如何使用├─────────────────────────────────

      md5(string,raw)
      參數解析:
        string: 必須,要轉換的字串(或變數)
        raw: 可略,輸出格式(二進位制或十六進位制)
         ├ TRUE: 輸出16個字符的二進制格式
         └ FALSE: 輸出32個字符十六進制格式(未設置參數時默認選項)

      sha1(string,raw)
      參數解析:
        string: 必須,要轉換的字串(或變數)
        raw: 可略,輸出格式(二進位制或十六進位制)
         ├ TRUE: 輸出20個字符的二進制格式
         └ FALSE: 輸出40個字符十六進制格式(未設置參數時默認選項)

      hash(algo,string,raw)
      參數解析:
        algo: 必須,使用的演算法
        string: 必須,要轉換的字串(或變數)
        raw: 可略,輸出格式(二進位制或十六進位制)

      另外關於hash可以使用的演算法可用hash_algos()列出(陣列,需以print_r()列出)

    ┤範例寫法├─────────────────────────────────

    01 <?php
    02   $string = "Hello bunny!";
    03   echo md5($string)."<br>";
    04   echo sha1($string)."<br>";
    05   echo hash("sha256",$string);
    06 ?>

    ┤輸出結果├─────────────────────────────────

    08f4951f7aeaf3a1977c46d7b0c08db1
    7d24988bb1911b0c7118bbd35cf1dc0de9003711
    fd27e8994a09a5c1197f1a3944c7518b27bc80e276cd2b381d8ddcf339d82a68

    ───────────────────────────────────────

    --
    ※ 發信站: 大兔的神密世界(BunnyBBS.nctu.me), 來自: 122.121.67.98
    → r2:雜湊不是加密                                              推 10/10 22:57

      當初寫這篇的時候用字沒有太精確
      我稍微修正一下用字
      順便說明一下

      雜湊:將字串以特定演算法計算出來一串雜湊值,現階段比較新的演算法(如:sha256
            或sha512等)都有不可逆的特性,無法逆向演算回原本的數值,現今常被用來把
            用戶密碼雜湊後非明碼的儲存在資料庫。
            但雜湊並非加密,2004年md5被證實無法防止碰撞,可以被破解,而sha1曾被視
            為md5的後繼者,但在2017年也被荷蘭密碼學研究小組CWI和Google正式宣布攻
            破。雖然至今仍未能攻破sha2,但是因為演算法與sha1相似,且隨著電腦硬體的
            發展,反向計算演算法越來越容易,因此sha2仍是有被攻破的一天。
            綜上所述,雜湊並非加密,雜湊只是將明碼的東西經過演算讓他以非明碼來表現
            的「所謂」的加密,但還是會有被攻破的疑慮。