對稱加密和非對稱加密 PHP加密

1. 對稱加密

對稱加密指的就是加密和解密使用同一個秘鑰,所以叫做對稱加密。對稱加密只有一個秘鑰,作為私鑰。?

常見的對稱加密算法:DES,AES,3DES等等。

2. 非對稱加密

非對稱加密指的是:加密和解密使用不同的秘鑰,一把作為公開的公鑰,另一把作為私鑰。公鑰加密的信息,只有私鑰才能解密。私鑰加密的信息,只有公鑰才能解密。?

常見的非對稱加密算法:RSA,ECC

3. 區別

對稱加密算法相比非對稱加密算法來說,加解密的效率要高得多。但是缺陷在于對于秘鑰的管理上,以及在非安全信道中通訊時,密鑰交換的安全性不能保障。所以在實際的網絡環境中,會將兩者混合使用.

例如針對C/S模型,?

1. 服務端計算出一對秘鑰pub/pri。將私鑰保密,將公鑰公開。?

2. 客戶端請求服務端時,拿到服務端的公鑰pub。?

3. 客戶端通過AES計算出一個對稱加密的秘鑰X。 然后使用pub將X進行加密。?

4. 客戶端將加密后的密文發送給服務端。服務端通過pri解密獲得X。?

5. 然后兩邊的通訊內容就通過對稱密鑰X以對稱加密算法來加解密。

PHP加密方法

1. MD5加密? 不可逆轉

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

參數

str? --? 原始字符串。

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

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 的數字值將被用來指定散列循環的執行次數,這點很像 Blowfish 算法的 cost 參數。默認的循環次數是 5000,最小是 1000,最大是 999,999,999。超出這個范圍的 N 將會被轉換為最接近的值。

CRYPT_SHA512 - SHA-512 算法使用一個以 $6$ 開頭的 16 字符字符串鹽值進行散列。如果鹽值字符串以 “rounds=$” 開頭,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

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修改為

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 庫以一個易于使用的類來提供該功能。


復制代碼代碼如下:


// 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

?>

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • /**ios常見的幾種加密方法: 普通的加密方法是講密碼進行加密后保存到用戶偏好設置( [NSUserDefaul...
    彬至睢陽閱讀 3,001評論 0 7
  • 概述 之前一直對加密相關的算法知之甚少,只知道類似DES、RSA等加密算法能對數據傳輸進行加密,且各種加密算法各有...
    Henryzhu閱讀 3,055評論 0 14
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,924評論 18 139
  • 失落時,尋一個你身邊最理性分析問題最客觀的親人、朋友甚至你敬佩的上司,跟他們談一談,你一定會看到另一線光明。 失意...
    木子_sunshine閱讀 145評論 0 0
  • 焦慮 相信很多人在今年都會聽到這樣的聲音,騰訊的股票我當時看的時候才180現在都400了?阿里巴巴的...
    踐行的朋友閱讀 676評論 2 4