PHP中的加密模組使用

來源:互聯網
上載者:User
    PHP中內建了相當多的加密的方法,這裡我們來看一下mcrypt擴充的使用方式。(也是在工作中需要用這個東西加密訪問使用者的Cookie的值,認真的學習了這個方面的內容。)

    1.簡介
    Mcrypt是PHP的一個擴充,完成了常用密碼編譯演算法的封裝。其實該擴充是對mcrypt標準類庫的封裝,mcrypt完成了相當多的常用密碼編譯演算法,如DES, TripleDES, Blowfish
(default), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 和
GOST密碼編譯演算法,並且提供了CBC、OFB、CFB 和 ECB 四種塊加密的模型。

    2.安裝和使用
    要使用該擴充,必須首先安裝mcrypt標準類庫,可以在http://mcrypt.sourceforge.net 下載。該擴充的編譯和安裝方式和常規的php擴充相同,不在詳細說明了。

    3.四種塊加密模型

    Mcrypt支援四種塊加密模型,簡要說明如下:
    a. MCRYPT_MODE_ECB(electronic codebook) 適合對小數量隨機資料的加密,比如加密使用者的登入密碼之類的。
    b. MCRYPT_MODE_CBC (cipher block chaining) 適合加密安全等級較高的重要檔案類型。
    c. MCRYPT_MODE_CFB (cipher feedback) 適合於需要對資料流的每一個位元組進行加密的場合。
    d. MCRYPT_MODE_OFB (output feedback, in 8bit) 和CFB模式相容,但比CFB模式更安全。CFB模式會引起加密的錯誤擴散,如果一個byte出錯,則其後續的所有byte都會出錯。OFB模式則不會有此問題。但該模式的安全度不是很高,不建議使用。
    e. MCRYPT_MODE_NOFB (output feedback, in nbit) 和OFB相容,由於採用了塊操作演算法,安全度更高。
    f. MCRYPT_MODE_STREAM 是為了WAKE或者RC4等流密碼編譯演算法提供的額外模型。
    NOFB和STREAM僅當mycrypt的版本號碼大於等於libmcrypt-2.4.x才有效。(現在基本上都是大於這個版本了,libmcrypt的最新主要版本已經到4了)

    4.查看支援的演算法和模型
    a. mcrypt_list_modes()列出當前環境支援的模型
    b. mcrypt_list_algorithms()列出當前環境支援的演算法
    如命令列執行:

  1. php -r "var_dump(mcrypt_list_modes()); var_dump(mcrypt_list_algorithms());"

    即可列出所有的結果。

    5.如何使用
    example1.

  1. <?php
  2. $key = "this is a secret key";
  3. $input = "Let us meet at 9 o'clock at the secret place.";
  4. $encrypted_data = mcrypt_ecb (MCRYPT_3DES, $key, $input, MCRYPT_ENCRYPT);
  5. ?>

    最簡單的方式如example1中所示,該方法表明對$input使用3DES的演算法進行加密,加密金鑰是$key.不過這中直接調用的方法已經不被官方推薦使用,也建議大家在開發中不要使用此種方式,不一定哪天該方法就不能用了。在php5下使用此種方式調用時,能看到一條warning資訊,提示“PHP Warning:  attempt to use an empty IV, which is NOT recommend”。

    官方推薦的使用方式如example2所示
    example2.

  1. <?php
  2.     $key = "this is a secret key";
  3.     $input = "Let us meet at 9 o'clock at the secret place.";
  4.     // 開啟mcrypt,或者mcrypt類型的資來源物件,該對象使用ecb模式,使用3des作為密碼編譯演算法。
  5.     $td = mcrypt_module_open('tripledes', '', 'ecb', '');
  6.     // 建立iv(初始化向量)
  7.     $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
  8.     // 根據密鑰和iv初始化$td,完成記憶體配置等初始化工作
  9.     mcrypt_generic_init($td, $key, $iv);
  10.     // 進行加密
  11.     $encrypted_data = mcrypt_generic($td, $input);
  12.     // 反初始化$td,釋放資源
  13.     mcrypt_generic_deinit($td);
  14.     // 關閉資來源物件,退出
  15.     mcrypt_module_close($td);
  16. ?>

    上述過程完成了資料的加密過程。首先選擇密碼編譯演算法和加密模式建立mcrypt的資來源物件和IV,然後初始化加密所需的buffer(記憶體),進行加密後再釋放buffer,最後關閉資來源物件。
     解密的過程和加密是基本相同,只要把mcrypt_generic($td, $input)替換成mdecrypt_generic($td, $input)就可以了,其它部分完全相同。當然,對於3des這種對稱式加密演算法而言,加密、解密所用的key是必須完全相同的。

    6. 有關IV
    不是所有的模型中都需要IV. CFB和OFB是必須有IV, CBC和EBC則是可選的。對於必選IV的模式來說,其加密和解密的IV的值必須完全相同,CBC和EBC則無此要求。可以相同也可以不同,沒什麼關係。

    7.一個簡易功能的加密解密類

  1. class AMPCrypt {
  2.     private static function getKey(){
  3.         return md5('exampleKey');
  4.     }
  5.     public static function encrypt($value){
  6.         $td = mcrypt_module_open('tripledes', '', 'ecb', '');
  7.         $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
  8.         $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td));
  9.         mcrypt_generic_init($td, $key, $iv);
  10.         $ret = base64_encode(mcrypt_generic($td, $value));
  11.         mcrypt_generic_deinit($td);
  12.         mcrypt_module_close($td);
  13.         return $ret;
  14.     }
  15.     public static function dencrypt($value){
  16.         $td = mcrypt_module_open('tripledes', '', 'ecb', '');
  17.         $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
  18.         $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td));
  19.         $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td));
  20.         mcrypt_generic_init($td, $key, $iv);
  21.         $ret = trim(mdecrypt_generic($td, base64_decode($value))) ;
  22.         mcrypt_generic_deinit($td);
  23.         mcrypt_module_close($td);
  24.         return $ret;
  25.     }
  26. }

    8. 參考
    http://tjccnwx.spaces.live.com/blog/cns!f075ab0998692de6!144.entry
    http://au2.php.net/manual/en/book.mcrypt.php

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.