程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP實現加密的幾種方式介紹

PHP實現加密的幾種方式介紹

編輯:關於PHP編程

     這篇文章主要介紹了PHP實現加密的幾種方式,非常全面實用,都是項目中經常需要用到的,需要的朋友可以參考下

       

    PHP中的加密方式有如下幾種

    1. MD5加密

    string md5 ( string $str [, bool $raw_output = false ] )

    參數

    str -- 原始字符串。

    raw_output -- 如果可選的 raw_output 被設置為 TRUE,那麼 MD5 報文摘要將以16字節長度的原始二進制格式返回。

    這是一種不可逆加密,執行如下的代碼

    $password = '123456';
    echo md5($password);
    得到結果是e10adc3949ba59abbe56e057f20f883e

    2. Crype加密
    string crypt ( string $str [, string $salt ] )

    crypt() 返回一個基於標准 UNIX DES 算法或系統上其他可用的替代算法的散列字符串。

    參數

    str -- 待散列的字符串。

    salt -- 可選的鹽值字符串。如果沒有提供,算法行為將由不同的算法實現決定,並可能導致不可預料的結束。

    這是也一種不可逆加密,執行如下的代碼

     

    代碼如下:
    $password = '123456';
    $salt = "test";// 只取前兩個
    echo crypt($password, $salt);

     

    得到的結果是teMGKvBPcptKo

    使用自動鹽值的例子如下:

     

    代碼如下:
    $password = crypt('mypassword'); // 自動生成鹽值
    /* 你應當使用 crypt() 得到的完整結果作為鹽值進行密碼校驗,以此來避免使用不同散列算法導致的問題。(如上所述,基於標准 DES 算法的密碼散列使用 2 字符鹽值,但是基於 MD5 算法的散列使用 12 個字符鹽值。)*/
    if (crypt('mypassword', $password) == $password) {
    echo "Password verified!";
    }

     

    執行結果是輸出 Password verified!

    以不同散列類型使用 crypt()的例子如下:

     

    代碼如下:
    if (CRYPT_STD_DES == 1) {
    echo 'Standard DES: ' . crypt('rasmuslerdorf', 'rl') . "n";
    }
    if (CRYPT_EXT_DES == 1) {
    echo 'Extended DES: ' . crypt('rasmuslerdorf', '_J9..rasm') . "n";
    }
    if (CRYPT_MD5 == 1) {
    echo 'MD5: ' . crypt('rasmuslerdorf', '$1$rasmusle$') . "n";
    }
    if (CRYPT_BLOWFISH == 1) {
    echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "n";
    }
    if (CRYPT_SHA256 == 1) {
    echo 'SHA-256: ' . crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$') . "n";
    }
    if (CRYPT_SHA512 == 1) {
    echo 'SHA-512: ' . crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$') . "n";
    }

     

    其結果如下

    Standard DES: rl.3StKT.4T8M
    Extended DES: _J9..rasmBYk8r9AiWNc
    MD5: $1$rasmusle$rISCgZzpwk3UhDidwXvin0
    Blowfish: $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
    SHA-256: $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6
    SHA-512: $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21
    在 crypt() 函數支持多重散列的系統上,下面的常量根據相應的類型是否可用被設置為 0 或 1:

    CRYPT_STD_DES - 基於標准 DES 算法的散列使用 "./0-9A-Za-z" 字符中的兩個字符作為鹽值。在鹽值中使用非法的字符將導致 crypt() 失敗。
    CRYPT_EXT_DES - 擴展的基於 DES 算法的散列。其鹽值為 9 個字符的字符串,由 1 個下劃線後面跟著 4 字節循環次數和 4 字節鹽值組成。它們被編碼成可打印字符,每個字符 6 位,有效位最少的優先。0 到 63 被編碼為 "./0-9A-Za-z"。在鹽值中使用非法的字符將導致 crypt() 失敗。
    CRYPT_MD5 - MD5 散列使用一個以 $1$ 開始的 12 字符的字符串鹽值。
    CRYPT_BLOWFISH - Blowfish 算法使用如下鹽值:“$2a$”,一個兩位 cost 參數,“$” 以及 64 位由 “./0-9A-Za-z” 中的字符組合而成的字符串。在鹽值中使用此范圍之外的字符將導致 crypt() 返回一個空字符串。兩位 cost 參數是循環次數以 2 為底的對數,它的范圍是 04-31,超出這個范圍將導致 crypt() 失敗。
    CRYPT_SHA256 - SHA-256 算法使用一個以 $5$ 開頭的 16 字符字符串鹽值進行散列。如果鹽值字符串以 “rounds=<N>$” 開頭,N 的數字值將被用來指定散列循環的執行次數,這點很像 Blowfish 算法的 cost 參數。默認的循環次數是 5000,最小是 1000,最大是 999,999,999。超出這個范圍的 N 將會被轉換為最接近的值。
    CRYPT_SHA512 - SHA-512 算法使用一個以 $6$ 開頭的 16 字符字符串鹽值進行散列。如果鹽值字符串以 “rounds=<N>$” 開頭,N 的數字值將被用來指定散列循環的執行次數,這點很像 Blowfish 算法的 cost 參數。默認的循環次數是 5000,最小是 1000,最大是 999,999,999。超出這個范圍的 N 將會被轉換為最接近的值。

    3. Sha1加密

    string sha1 ( string $str [, bool $raw_output = false ] )

    參數

    str -- 輸入字符串。

    raw_output -- 如果可選的 raw_output 參數被設置為 TRUE,那麼 sha1 摘要將以 20 字符長度的原始格式返回,否則返回值是一個 40 字符長度的十六進制數字。

    這是也一種不可逆加密,執行如下代碼:

    $password = '123456';
    echo sha1($password);
    得到的結果是7c4a8d09ca3762af61e59520943dc26494f8941b

    以上幾種雖然是不可逆加密,但是也可以根據查字典的方式去解密。如下的地址中就提供了可以將上面的加密結果解密出來的功能。

    http://www.cmd5.com/

    那大家是不是加了就算加了密,也沒用啊,其實不然,只要你的加密足夠復雜,被破解出的可能性就越小,比如用以上三種加密方式混合加密,之後我會推薦給大家一個php的加密庫。

    4. URL加密

    string urlencode ( string $str )

    此函數便於將字符串編碼並將其用於 URL 的請求部分,同時它還便於將變量傳遞給下一頁。

    返回字符串,此字符串中除了 -_. 之外的所有非字母數字字符都將被替換成百分號(%)後跟兩位十六進制數,空格則編碼為加號(+)。此編碼與 WWW 表單 POST 數據的編碼方式是一樣的,同時與 application/x-www-form-urlencoded 的媒體類型編碼方式一樣。由於歷史原因,此編碼在將空格編碼為加號(+)方面與 RFC1738 編碼不同。

    string urldecode ( string $str )

    解碼給出的已編碼字符串中的任何 %##。 加號('+')被解碼成一個空格字符。

    這是一種可逆加密,urlencode方法用於加密,urldecode方法用於解密,執行如下代碼:

    $url = 'http://www.xxx.com/CraryPrimitiveMan/';
    $encodeUrl = urlencode($url);
    echo $encodeUrl . "n";// 如果是在網頁上展示的,就將n修改為<br/>
    echo urldecode($encodeUrl);
    得到的結果如下

    http%3A%2F%2Fwww.xxx.com%2FCraryPrimitiveMan%2F
    http://www.xxx.com/CraryPrimitiveMan/
    基於RFC 3986的加密URL的方法如下:

     

    代碼如下:
    function myUrlEncode($string) {
    $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D');
    $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");
    return str_replace($entities, $replacements, urlencode($string));
    }

     

    5. Base64信息編碼加密

    string base64_encode ( string $data )

    使用 base64 對 data 進行編碼。

    設計此種編碼是為了使二進制數據可以通過非純 8-bit 的傳輸層傳輸,例如電子郵件的主體。

    Base64-encoded 數據要比原始數據多占用 33% 左右的空間。

    string base64_decode ( string $data [, bool $strict = false ] )

    對 base64 編碼的 data 進行解碼。

    參數

    data -- 編碼過的數據。

    strict -- 如果輸入的數據超出了 base64 字母表,則返回 FALSE。

    執行如下代碼:

     

    代碼如下:
    $name = 'CraryPrimitiveMan';
    $encodeName = base64_encode($name);
    echo $encodeName . "n";
    echo base64_decode($encodeName);

     

    其結果如下

     

    代碼如下:
    Q3JhcnlQcmltaXRpdmVNYW4=
    CraryPrimitiveMan

     

    推薦phpass

    經 phpass 0.3 測試,在存入數據庫之前進行哈希保護用戶密碼的標准方式。 許多常用的哈希算法如 md5,甚至是 sha1 對於密碼存儲都是不安全的, 因為駭客能夠使用那些算法輕而易舉地破解密碼。

    對密碼進行哈希最安全的方法是使用 bcrypt 算法。開源的 phpass 庫以一個易於使用的類來提供該功能。

     

    代碼如下:
    <?php
    // Include phpass 庫
    require_once('phpass-03/PasswordHash.php')
    // 初始化散列器為不可移植(這樣更安全)
    $hasher = new PasswordHash(8, false);
    // 計算密碼的哈希值。$hashedPassword 是一個長度為 60 個字符的字符串.
    $hashedPassword = $hasher->HashPassword('my super cool password');
    // 你現在可以安全地將 $hashedPassword 保存到數據庫中!
    // 通過比較用戶輸入內容(產生的哈希值)和我們之前計算出的哈希值,來判斷用戶是否輸入了正確的密碼
    $hasher->CheckPassword('the wrong password', $hashedPassword); // false
    $hasher->CheckPassword('my super cool password', $hashedPassword); // true
    ?>

     

    以上就是本文關於PHP加密方式的介紹了,希望大家能夠喜歡。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved