單向加密:
單向加密又稱為不可逆加密算法,在加密過程中不使用密鑰,明文由系統加密處理成密文,密文無法解密。一般適合於驗證,在驗證過程中,重新輸入明文,並經過同樣的加密算法處理,得到相同的密文並被系統重新認證。廣泛使用於口令加密。
一:base64
常見於郵件、http加密,截取http信息,你就會發現登錄操作的用戶名、密碼字段通過BASE64加密的。
主要就是BASE64Encoder、BASE64Decoder兩個類
BASE加密后產生的字節位數是8的倍數,如果不夠位數以=符號填充
二:md5
message-digest algorithm 5
三:Crypt加密:
1.crypt()接受兩個參數,第一個為需要加密的字符串,第二個為鹽值(就是加密干擾值,如果沒有提供,則默認由PHP自動生成);返回散列后的字符串或一個少於 13 字符的字符串,后者為了區別鹽值。
2.crypt()為單向加密,跟md5一樣。
四:Sha1加密:
string sha1 ( string str[,boolraw_output = false ]
1.跟md5很像,不同的是sha1()默認情況下返回40個字符的散列值,傳入參數性質一樣,第一個為加密的字符串,第二個為raw_output的布爾值,默認為false,如果設置為true,sha1()則會返回原始的20 位原始格式報文摘要
2.sha1()也是單行加密,沒有逆向解密算法
string urlencode ( string $str )
1.一個參數,傳入要加密的字符串(通常應用於對URL的加密),
2.urlencode為雙向加密,可以用urldecode來加密(嚴格意義上來說,不算真正的加密)
3.返回字符串,此字符串中除了 -_. 之外的所有非字母數字字符都將被替換成百分號(%)后跟兩位十六進制數,空格則編碼為加號(+)。
對稱加密算法的優點是算法公開、計算量小、加密速度快、加密效率高。
對稱加密算法的缺點是在數據傳送前,發送方和接收方必須商定好秘鑰,然后使雙方都能保存好秘鑰。其次如果一方的秘鑰被泄露,那么加密信息也就不安全了。另外,每對用戶每次使用對稱加密算法時,都需要使用其他人不知道的唯一秘鑰,這會使得收、發雙方所擁有的鑰匙數量巨大,密鑰管理成為雙方的負擔。
非對稱加密:
先說非對稱加密 . 直接理解為 2把鑰匙. 分別叫 公鑰 私鑰一把加密,另一把解密. (每把都可用於加密,但是對應的那把才能解密)
比如. 一間屋子,有2個門 ,對應2把不同的鑰匙. 規則是,前門進,后門出或是后門前,前門出.
如果從前門進,只能使用前門鑰匙進. 出去的話從后門出,只能使用后門鑰匙.
如果后門進,就得用后門鑰匙.出去走前門,只能用前門鑰匙出.
那么PHP如何得到這兩把鑰匙呢,,,,php中,借助openssl實現.首先確定一下是否支持 phpinfo中 搜索 openssl 如果出現下圖說明成功支持,本文建議在linux下測試

在生成鑰匙之前先要了解一個概念 1個是鑰匙文件(里面是鑰匙字符串) . 1個是鑰匙對象.(專門用於各種操作,理解為實例化后使用)
生成文件 代碼如下
1 <?php 2 //第一步,生成一把新鑰匙對象這是私鑰對象 3 $key = openssl_pkey_new(); 4 //第二步,把生成的私鑰,保存成私鑰文件 5 openssl_pkey_export_to_file($key, './private.txt'); 6 //下面這句注視的意思是,從現有的私鑰文件,獲取到私鑰對象 7 //$key = openssl_get_privatekey(file_get_contents( './private.txt')); 8 //從私鑰中,獲取公鑰字符串 后面['key']的意思是從這個數組中直接獲取該鍵 9 $key_detail = openssl_pkey_get_details($key)['key']; 10 //把公鑰字符串,保存成文件 11 file_put_contents('./public.txt', $key_detail); 12 echo '完成';
刷新生成成功后.如圖

到此.鑰匙獲取完畢. 下一篇講加密
可以借助linux中的 ssh_keygen命令來生成 代碼如下
1 ssh-keygen -t rsa -N '' -f ./key -q
上面代碼中
-t是指類型 rsa
-N ''不需要密碼
-f 指定生成的私鑰文件 是當前目錄下的key
-q 不需要廢話.直接生成
執行完后當前目錄 會生成一個key 和一個key.pub 這兩個文件 對應的也是公鑰和私鑰
注意 php源碼中這樣定義
1 enum php_openssl_key_type { 2 OPENSSL_KEYTYPE_RSA, 3 OPENSSL_KEYTYPE_DSA, 4 OPENSSL_KEYTYPE_DH, 5 OPENSSL_KEYTYPE_DEFAULT = OPENSSL_KEYTYPE_RSA 6 };
可以看出.加密方式有rsa dsa dh 默認是rsa
1 <?php 2 //第一步,取出私鑰。 3 $private_key=openssl_get_privatekey(file_get_contents('./private.txt')); 4 //第二步,取出公鑰,2種方式 ,一種是從文件中取,如下 5 //$public_key=openssl_get_publickey(file_get_contents('./public.txt')); 6 //另一種是,從私鑰里面取 ,理論上內存中計算要比文件中獲取要快,兩種方法任選其一 7 $public_key=openssl_get_publickey(openssl_pkey_get_details($private_key)['key']); 8 //原字符串 9 $origin_str='中英文Abc+123'; 10 //使用公鑰k加密函數進行加密,第一個參數原文,第二個參數是結果。 第三個參數是 公鑰對象 (私鑰對象會報錯) 11 openssl_public_encrypt($origin_str, $crypted, $public_key); 12 //var_dump($crypted是亂碼); 13 //使用公鑰加密后。只能使用私鑰解密函數進行解密,注意第三個參數是私鑰對象 14 openssl_private_decrypt($crypted, $decrypted, $private_key); 15 //var_dump($decrypted)得到了原文 16 //也可以 相反的操作。 私鑰加密,公鑰解密。如下 17 openssl_private_encrypt($origin_str, $crypted, $private_key); 18 openssl_public_decrypt($crypted, $result, $public_key); 19 //vardump($result)也是原文
一般實際應用中,其中一個頁面加密后.傳給另一個頁面密文.然后通過密文進行解密.然后得到結果.
注意,公鑰加密,需要私鑰解密
或是 私鑰加密,公鑰解密.
另外.公鑰函數只能使用公鑰對象. 私鑰相同.
還記得之前說過.私鑰中提取公鑰嗎?所以說.最好使用公鑰加密,以免傳送過程被攔截私鑰
自己的代碼:
1 <?php 2 //生成私鑰文件 3 //$key=openssl_pkey_new(); 4 //openssl_pkey_export_to_file($key,'./1.txt'); 5 6 //從文件中提取 7 //$key=openssl_get_privatekey(file_get_contents('./1.txt')); 8 //$key_dets=openssl_pkey_get_details($key)['key']; 9 // 10 //file_put_contents('./2.txt',$key_dets); 11 12 13 //第一步 提取私鑰 14 $privatekey=openssl_get_privatekey(file_get_contents('./1.txt')); 15 //第二步 取出公鑰 2種方法 一種文件中取 16 $putkey=openssl_get_publickey(file_get_contents('./5.txt')); 17 18 //另一種從私鑰文件中取 19 //$putkey=openssl_get_publickey(openssl_pkey_get_details($privatekey)['key']); 20 //原字符串 21 //var_dump($privatekey,$putkey); 22 23 $orign_str='中文'; 24 openssl_public_encrypt($orign_str,$crypted,$putkey); 25 //var_dump($crypted); 26 openssl_private_decrypt($crypted,$decrypted,$privatekey); 27 var_dump($decrypted); 28 ?>
