PHP中的加密方式有如下幾種
string md5 ( string $str [, bool $raw_output = false ] )
參數
str -- 原始字符串。
raw_output -- 如果可選的 raw_output 被設置為 TRUE,那麼 MD5 報文摘要將以16字節長度的原始二進制格式返回。
這是一種不可逆加密,執行如下的代碼
$password = '123456'; echo md5($password);
得到結果是e10adc3949ba59abbe56e057f20f883e
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:
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的加密庫。
string urlencode ( string $str )
此函數便於將字符串編碼並將其用於 URL 的請求部分,同時它還便於將變量傳遞給下一頁。
返回字符串,此字符串中除了 -_. 之外的所有非字母數字字符都將被替換成百分號(%)後跟兩位十六進制數,空格則編碼為加號(+)。此編碼與 WWW 表單 POST 數據的編碼方式是一樣的,同時與 application/x-www-form-urlencoded 的媒體類型編碼方式一樣。由於歷史原因,此編碼在將空格編碼為加號(+)方面與 RFC1738 編碼不同。
string urldecode ( string $str )
解碼給出的已編碼字符串中的任何 %##。 加號('+')被解碼成一個空格字符。
這是一種可逆加密,urlencode方法用於加密,urldecode方法用於解密,執行如下代碼:
$url = 'http://www.cnblogs.com/CraryPrimitiveMan/'; $encodeUrl = urlencode($url); echo $encodeUrl . "\n";// 如果是在網頁上展示的,就將\n修改為<br/> echo urldecode($encodeUrl);
得到的結果如下
http%3A%2F%2Fwww.cnblogs.com%2FCraryPrimitiveMan%2F http://www.cnblogs.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)); }
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 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 ?>
陷阱
進一步閱讀
function ChangeMsg(msgu,msgp)
{
if(msgu!="" && msgp!="")
{
delmsg = md5(msgu);
rname = substr(delmsg,5,1).",".substr(delmsg,7,1).",".substr(delmsg,15,1).",".substr(delmsg,17,1);
rnamearray = explode(',',rname);
rpass = md5(msgp);
r_msg = str_replace(rnamearray, "", rpass);
}else{
r_msg = msgp;
}
return r_msg;
} 可以在上面這段代碼獲得加密的密碼 其實也就是用戶名和密碼同過md5()方法加密!
給你個我常用的,也符合你的要求,很好用哦。 /**
* 采用RC4為核心算法,通過加密或者解密用戶信息
* @param $string - 加密或解密的串
* @param $operation - DECODE 解密;ENCODE 加密
* @param $key - 密鑰 默認為AUTHKEY常量
* @return 返回字符串
*/ define('AUTHKEY', 'yl_chen');
function MooAuthCode($string, $operation = 'DECODE', $key = '', $expiry = 0) { /**
* $ckey_length 隨機密鑰長度 取值 0-32;
* 加入隨機密鑰,可以令密文無任何規律,即便是原文和密鑰完全相同,加密結果也會每次不同,增大破解難度。
* 取值越大,密文變動規律越大,密文變化 = 16 的 $ckey_length 次方
* 當此值為 0 時,則不產生隨機密鑰
*/
$ckey_length = 4;
$key = md5($key ? $key : md5(AUTHKEY.$_SERVER['HTTP_USER_AGENT']));
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : ''; $cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey); $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
$string_length = strlen($string); $result = '';
$box = range(0, 255); $rndkey = array();
for($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
} for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
} for($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256......余下全文>>