<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                <table width="100%" border="0" cellspacing="0" cellpadding="5" bgcolor="#649CCC"><tr valign="middle"><td align="left"> <p class="p_Heading1"><span class="f_Heading1">附錄C. 加密</span></p> </td> <td align="right"> <span style="font-size: 9pt"> <a href="introduction.htm">Top</a>? <a href="new_item54.htm">Previous</a>? </span> </td> </tr></table> <table width="100%" border="0" cellspacing="0" cellpadding="5"><tr valign="top"><td align="left"><p style="line-height: 1.50;">附錄C. 加密</p><p style="line-height: 1.50;"> ? 作為一本相關安全方面的書,通常加密是需要提及的話題。我之所以在本書的主體部分忽略了加密問題,是因為它的用途是狹窄的,而開發者應從大處著眼來考慮安全問題。過分依賴于加密常常會混淆問題的根源。盡管加密本身是有效的,但是進行加密并不會神奇地提高一個應用的安全性。</p><p style="line-height: 1.50;"> ? 一個PHP開發人員應主要熟悉以下的加密方式:</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;">l ? ? ? ?對稱加密</p><p style="line-height: 1.50;">l ? ? ? ?非對稱加密(公鑰)</p><p style="line-height: 1.50;">l ? ? ? ?Hash函數(信息摘要)</p><p style="line-height: 1.50;">l ? ? ? ?信息驗證碼</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? 本附錄主要關注于使用mcrypt擴展的對稱加密算法。你需要參考的資料如下:</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? 實用加密技術(Applied Cryptography), by Bruce Schneier (Wiley)</p><p style="line-height: 1.50;">http://www.schneier.com/blog/</p><p style="line-height: 1.50;">http://wikipedia.org/wiki/Cryptography</p><p style="line-height: 1.50;">http://phpsec.org/articles/2005/password-hashing.html</p><p style="line-height: 1.50;">http://pear.php.net/package/Crypt_HMAC</p><p style="line-height: 1.50;">http://pear.php.net/package/Crypt_RSA</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;">C.1. 密碼的存儲</p><p style="line-height: 1.50;"> ? 當你在數據庫內存儲的密碼時,永遠不要以明碼方式存入,而是應該存儲密碼的hash值并同時使用附加字串:</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? &lt;?php</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? /* $password contains the password. */</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $salt = 'SHIFLETT';</p><p style="line-height: 1.50;"> ? $password_hash = md5($salt . md5($password . $salt));</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? /* Store password hash. */</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ?&gt;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? 當你需要確認一個密碼是否正確時,以同樣的方式計算出hash值并比較異同:</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? &lt;?php</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $salt = 'SHIFLETT';</p><p style="line-height: 1.50;"> ? $password_hash = md5($salt . md5($_POST['password'] . $salt));</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? /* Compare password hashes. */</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ?&gt;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? 如果hash值完全相同,你就有理由認為密碼也是相同的。</p><p style="line-height: 1.50;"> ? 如果使用了這個技巧,是不可能告訴用戶他們的密碼是什么的。當用戶忘記密碼時,你只能讓他錄入一個新密碼并重新計算hash值存入數據庫。當然,你需要非常小心地對用戶進行身份確認——密碼提醒機制是易受頻繁攻擊的目標,同時也是經常出現安全漏洞的源頭。</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;">C.2. 使用mcrypt</p><p style="line-height: 1.50;"> ? PHP的標準加密擴展是mcrypt,它支持很多不同的加密算法。你可以通過mcrypt_list_algorithms( )函數來查看你的平臺上支持的算法列表:</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? &lt;?php</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? echo '&lt;pre&gt;' . print_r(mcrypt_list_algorithms(), TRUE) . '&lt;/pre&gt;';</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ?&gt;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? 加密和解密分別由mcrypt_encrypt( ) 及 mcrypt_decrypt( )函數來實現。這兩個函數都有5個參數,第一個參數是用于指定使用的算法:</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? &lt;?php</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? mcrypt_encrypt($algorithm,</p><p style="line-height: 1.50;"> ? ? ? ? ? ? ? ? ?$key,</p><p style="line-height: 1.50;"> ? ? ? ? ? ? ? ? ?$cleartext,</p><p style="line-height: 1.50;"> ? ? ? ? ? ? ? ? ?$mode,</p><p style="line-height: 1.50;"> ? ? ? ? ? ? ? ? ?$iv);</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? mcrypt_decrypt($algorithm,</p><p style="line-height: 1.50;"> ? ? ? ? ? ? ? ? ?$key,</p><p style="line-height: 1.50;"> ? ? ? ? ? ? ? ? ?$ciphertext,</p><p style="line-height: 1.50;"> ? ? ? ? ? ? ? ? ?$mode,</p><p style="line-height: 1.50;"> ? ? ? ? ? ? ? ? ?$iv);</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ?&gt;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? 其中的加密鍵(第二個參數)是非常敏感的數據,因此你要確保把它存放在安全的地方。可以用第八章中保護數據庫權限的方法來保護加密鍵。如果經濟條件允許的話,硬件加密鍵是最好的選擇,它提供了超級強大的安全性。</p><p style="line-height: 1.50;"> ? 函數有多種模式可供選擇,你可以使用mcrypt_list_modes( )來列出所有支持的模式:</p><p style="line-height: 1.50;"> ? &lt;?php</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? echo '&lt;pre&gt;' . print_r(mcrypt_list_modes(), TRUE) . '&lt;/pre&gt;';</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ?&gt;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? 第五個參數($iv)為初始化向量,可以使用mcrypt_create_iv( )函數建立。</p><p style="line-height: 1.50;"> ? 下面的示例類提供了基本的加密解密方法:</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? class crypt</p><p style="line-height: 1.50;"> ? {</p><p style="line-height: 1.50;"> ? ? private $algorithm;</p><p style="line-height: 1.50;"> ? ? private $mode;</p><p style="line-height: 1.50;"> ? ? private $random_source;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? public $cleartext;</p><p style="line-height: 1.50;"> ? ? public $ciphertext;</p><p style="line-height: 1.50;"> ? ? public $iv;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? public function __construct($algorithm = MCRYPT_BLOWFISH,</p><p style="line-height: 1.50;"> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? $mode = MCRYPT_MODE_CBC,</p><p style="line-height: 1.50;"> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? $random_source = MCRYPT_DEV_URANDOM)</p><p style="line-height: 1.50;"> ? ? {</p><p style="line-height: 1.50;"> ? ? ? $this-&gt;algorithm = $algorithm;</p><p style="line-height: 1.50;"> ? ? ? $this-&gt;mode = $mode;</p><p style="line-height: 1.50;"> ? ? ? $this-&gt;random_source = $random_source;</p><p style="line-height: 1.50;"> ? ? }</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? public function generate_iv()</p><p style="line-height: 1.50;"> ? ? {</p><p style="line-height: 1.50;"> ? ? ? $this-&gt;iv = mcrypt_create_iv(mcrypt_get_iv_size($this-&gt;algorithm,</p><p style="line-height: 1.50;"> ? ? ? ? $this-&gt;mode), $this-&gt;random_source);</p><p style="line-height: 1.50;"> ? ? }</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? public function encrypt()</p><p style="line-height: 1.50;"> ? ? {</p><p style="line-height: 1.50;"> ? ? ? $this-&gt;ciphertext = mcrypt_encrypt($this-&gt;algorithm,</p><p style="line-height: 1.50;"> ? ? ? ? $_SERVER['CRYPT_KEY'], $this-&gt;cleartext, $this-&gt;mode, $this-&gt;iv);</p><p style="line-height: 1.50;"> ? ? }</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? public function decrypt()</p><p style="line-height: 1.50;"> ? ? {</p><p style="line-height: 1.50;"> ? ? ? $this-&gt;cleartext = mcrypt_decrypt($this-&gt;algorithm,</p><p style="line-height: 1.50;"> ? ? ? ? $_SERVER['CRYPT_KEY'], $this-&gt;ciphertext, $this-&gt;mode, $this-&gt;iv);</p><p style="line-height: 1.50;"> ? ? }</p><p style="line-height: 1.50;"> ? }</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ?&gt;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? 上面的類會在其它示例中使用,下面是它的使用方法示例:</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? &lt;?php</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $crypt = new crypt();</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $crypt-&gt;cleartext = 'This is a string';</p><p style="line-height: 1.50;"> ? $crypt-&gt;generate_iv();</p><p style="line-height: 1.50;"> ? $crypt-&gt;encrypt();</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $ciphertext = base64_encode($crypt-&gt;ciphertext);</p><p style="line-height: 1.50;"> ? $iv = base64_encode($crypt-&gt;iv);</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? unset($crypt);</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? /* Store $ciphertext and $iv (initialization vector). */</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $ciphertext = base64_decode($ciphertext);</p><p style="line-height: 1.50;"> ? $iv = base64_decode($iv);</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $crypt = new crypt();</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $crypt-&gt;iv = $iv;</p><p style="line-height: 1.50;"> ? $crypt-&gt;ciphertext = $ciphertext;</p><p style="line-height: 1.50;"> ? $crypt-&gt;decrypt();</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $cleartext = $crypt-&gt;cleartext;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ?&gt;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;">小提示</p><p style="line-height: 1.50;"> ? 本擴展要求你在編譯PHP時使用-mcrypt標識。安裝指南及要求詳見http://php.net/mcrypt。</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;">C.3. 信用卡號的保存</p><p style="line-height: 1.50;"> ? 我常常被問到如何安全地保存信用卡號。我的總是會首先詢問他們是否確實有必要保存信用卡號。畢竟不管具體是如何操作的,引入不必要的風險是不明智的。同時國家法律還有關于信用卡信息處理方面的規定,我還時刻小心地提醒我并不是一個法律專家。</p><p style="line-height: 1.50;"> ? 本書中我并不會專門討論信用卡處理的方法,而是會說明如何保存加密信息到數據庫及在讀取時解密。該流程會導致系統性能的下降,但是確實提供了一層保護措施。其主要優點是如果數據庫內容泄密暴露出的只是加密信息,但是前提是加密鍵是安全的。因此,加密鍵與加密的實現方法本身同樣重要。</p><p style="line-height: 1.50;"> ? 保存加密數據到數據的過程是,首先加密數據,然后通過初始向量與明文建立密文來保存到數據庫。由于密文是二進制字符串,還需要通過base64_encode( )轉換成普通文本字符串以保證二進制編碼的安全存儲。</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? &lt;?php</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $crypt = new crypt();</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $crypt-&gt;cleartext = '1234567890123456';</p><p style="line-height: 1.50;"> ? $crypt-&gt;generate_iv();</p><p style="line-height: 1.50;"> ? $crypt-&gt;encrypt();</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $ciphertext = $crypt-&gt;ciphertext;</p><p style="line-height: 1.50;"> ? $iv = $crypt-&gt;iv;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $string = base64_encode($iv . $ciphertext);</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ?&gt;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? 保存該字串至數據庫。在讀取時,則是上面流程的逆處理:</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? &lt;?php</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $string = base64_decode($string);</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $iv_size = mcrypt_get_iv_size($algorithm, $mode);</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $ciphertext = substr($string, $iv_size);</p><p style="line-height: 1.50;"> ? $iv = substr($string, 0, $iv_size);</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $crypt = new crypt();</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $crypt-&gt;iv = $iv;</p><p style="line-height: 1.50;"> ? $crypt-&gt;ciphertext = $ciphertext;</p><p style="line-height: 1.50;"> ? $crypt-&gt;decrypt();</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? $cleartext = ?$crypt-&gt;cleartext;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ?&gt;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? 本實現方法假定加密算法與模式不變。如果它們是不定的話,你還要保存它們以用于解密數據。加密鍵是唯一需要保密的數據。</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;">C.4. 加密會話數據</p><p style="line-height: 1.50;"> ? 如果你的數據庫存在安全問題,或者部分保存在會話中的數據是敏感的,你可能希望加密會話數據。除非很有必要,一般我不推薦這樣做,但是如果你覺得在你的情形下需要這樣做的話,本節提供了一個實現方法的示例。</p><p style="line-height: 1.50;"> ? 這個方案十分簡單。實際上,在第八章中,已經說明了如何通過調用session_set_save_handler( )來執行你自己的會話機制。通過對保存和讀取數據的函數的少量調整,你就能加密存入數據庫的數據及在讀取時解密數據:</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? &lt;?php</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? function _read($id)</p><p style="line-height: 1.50;"> ? {</p><p style="line-height: 1.50;"> ? ? global $_sess_db;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? $algorithm = MCRYPT_BLOWFISH;</p><p style="line-height: 1.50;"> ? ? $mode = MCRYPT_MODE_CBC;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? $id = mysql_real_escape_string($id);</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? $sql = "SELECT data</p><p style="line-height: 1.50;"> ? ? ? ? ? ? FROM ? sessions</p><p style="line-height: 1.50;"> ? ? ? ? ? ? WHERE ?id = '$id'";</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? if ($result = mysql_query($sql, $_sess_db))</p><p style="line-height: 1.50;"> ? ? {</p><p style="line-height: 1.50;"> ? ? ? ? $record = mysql_fetch_assoc($result);</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? ? ? $data = base64_decode($record['data']);</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? ? ? $iv_size = mcrypt_get_iv_size($algorithm, $mode);</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? ? ? $ciphertext = substr($data, $iv_size);</p><p style="line-height: 1.50;"> ? ? ? ? $iv = substr($data, 0, $iv_size);</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? ? ? $crypt = new crypt();</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? ? ? $crypt-&gt;iv = $iv;</p><p style="line-height: 1.50;"> ? ? ? ? $crypt-&gt;ciphertext = $ciphertext;</p><p style="line-height: 1.50;"> ? ? ? ? $crypt-&gt;decrypt();</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? ? ? return $crypt-&gt;cleartext;</p><p style="line-height: 1.50;"> ? ? }</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? return '';</p><p style="line-height: 1.50;"> ? }</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? function _write($id, $data)</p><p style="line-height: 1.50;"> ? {</p><p style="line-height: 1.50;"> ? ? global $_sess_db;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? $access = time();</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? $crypt = new crypt();</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? $crypt-&gt;cleartext = $data;</p><p style="line-height: 1.50;"> ? ? $crypt-&gt;generate_iv();</p><p style="line-height: 1.50;"> ? ? $crypt-&gt;encrypt();</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? $ciphertext = $crypt-&gt;ciphertext;</p><p style="line-height: 1.50;"> ? ? $iv = $crypt-&gt;iv;</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? $data = base64_encode($iv . $ciphertext);</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? $id = mysql_real_escape_string($id);</p><p style="line-height: 1.50;"> ? ? $access = mysql_real_escape_string($access);</p><p style="line-height: 1.50;"> ? ? $data = mysql_real_escape_string($data);</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? $sql = "REPLACE</p><p style="line-height: 1.50;"> ? ? ? ? ? ? INTO ? ?sessions</p><p style="line-height: 1.50;"> ? ? ? ? ? ? VALUES ?('$id', '$access', '$data')";</p><p style="line-height: 1.50;">?</p><p style="line-height: 1.50;"> ? ? return mysql_query($sql, $_sess_db);</p><p style="line-height: 1.50;"> ? }</p><p style="line-height: 1.50;">?</p><hr noshade="noshade" size="1"/><p style="line-height: 1.50;">?</p></td></tr></table>
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看