加密的類型:php
在平常設計及開發中,爲確保數據傳輸和數據存儲的安全,可經過特定的算法,將數據明文加密成複雜的密文。目前主流加密手段大體可分爲單向加密和雙向加密。 單向加密:經過對數據進行摘要計算生成密文,密文不可逆推還原。算法表明:Base64,MD5,SHA; 雙向加密:與單向加密相反,能夠把密文逆推還原成明文,雙向加密又分爲對稱加密和非對稱加密。 對稱加密:指數據使用者必須擁有相同的密鑰才能夠進行加密解密,就像彼此約定的一串暗號。算法表明:DES,3DES,AES,IDEA,RC4,RC5; 非對稱加密:相對對稱加密而言,無需擁有同一組密鑰,非對稱加密是一種「信息公開的密鑰交換協議」。非對稱加密須要公開密鑰和私有密鑰兩組密鑰,公開密鑰和私有密鑰是配對起來的,
也就是說使用公開密鑰進行數據加密,只有對應的私有密鑰才能解密。這兩個密鑰是數學相關,用某用戶密鑰加密後的密文,只能使用該用戶的加密密鑰才能解密。若是知道了其中一個,並
不能計算出另一個。所以若是公開了一對密鑰中的一個,並不會危害到另一個密鑰性質。這裏把公開的密鑰爲公鑰,不公開的密鑰爲私鑰。算法表明:RSA,DSA。
之前一直對客戶端傳給服務器的信息加密這一塊一臉懵,若是app裏面的用戶登陸信息被抓包拿到了,大寫着 username:root,password:123456, 那不是很尷尬。前端
偶然作版權輸入的時候遇到了rsa,在支付寶支付的時候也接觸過,當時不知道這是啥子,如今才知道。android
他能保證,客戶端給出的信息,只有擁有私鑰的服務器才能看,其餘人看的都是亂碼,嘿嘿。ios
非對稱加密算法
須要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。 公開密鑰與私有密鑰是一對,若是用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密; 若是用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。 由於加密和解密使用的是兩個不一樣的密鑰,因此這種算法叫做非對稱加密算法。
注意以上的一個點,公鑰加密的數據,只有對應的私鑰才能解密web
將私鑰private_key.pem用在服務器端,公鑰發放給android跟ios等前端
客戶端用公鑰加密事後,數據只能被擁有惟一私鑰的服務器看懂。算法
具體實現:json
一、加密解密的第一步是生成公鑰、私鑰對,私鑰加密的內容能經過公鑰解密(反過來亦能夠)安全
1 下載開源RSA密鑰生成工具openssl(一般Linux系統都自帶該程序),解壓縮至獨立的文件夾,進入其中的bin目錄,執行如下命令: 2 a、openssl genrsa -out rsa_private_key.pem 1024 3 b、openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem 4 c、openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 5 6 第一條命令生成原始 RSA私鑰文件 rsa_private_key.pem 7 第二條命令將原始 RSA私鑰轉換爲 pkcs8格式 8 第三條生成RSA公鑰 rsa_public_key.pem 9 10 上面幾個就能夠看出:經過私鑰能生成對應的公鑰
也有一些網站提供生成rsa公鑰私鑰的服務:http://www.bm8.com.cn/webtool/rsa/服務器
二、PHP的加密解密類庫:app
<?php class Rsa { /** * 獲取私鑰 * @return bool|resource */ private static function getPrivateKey() { $abs_path = dirname(__FILE__) . '/rsa_private_key.pem'; $content = file_get_contents($abs_path); return openssl_pkey_get_private($content); } /** * 獲取公鑰 * @return bool|resource */ private static function getPublicKey() { $abs_path = dirname(__FILE__) . '/rsa_public_key.pem'; $content = file_get_contents($abs_path); return openssl_pkey_get_public($content); } /** * 私鑰加密 * @param string $data * @return null|string */ public static function privEncrypt($data = '') { if (!is_string($data)) { return null; } return openssl_private_encrypt($data,$encrypted,self::getPrivateKey()) ? base64_encode($encrypted) : null; } /** * 公鑰加密 * @param string $data * @return null|string */ public static function publicEncrypt($data = '') { if (!is_string($data)) { return null; } return openssl_public_encrypt($data,$encrypted,self::getPublicKey()) ? base64_encode($encrypted) : null; } /** * 私鑰解密 * @param string $encrypted * @return null */ public static function privDecrypt($encrypted = '') { if (!is_string($encrypted)) { return null; } return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, self::getPrivateKey())) ? $decrypted : null; } /** * 公鑰解密 * @param string $encrypted * @return null */ public static function publicDecrypt($encrypted = '') { if (!is_string($encrypted)) { return null; } return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, self::getPublicKey())) ? $decrypted : null; } }
調用demo:
<?php require_once "Rsa.php"; $rsa = new Rsa(); $data['name'] = 'Tom'; $data['age'] = '20'; $privEncrypt = $rsa->privEncrypt(json_encode($data)); echo '私鑰加密後:'.$privEncrypt.'<br>'; $publicDecrypt = $rsa->publicDecrypt($privEncrypt); echo '公鑰解密後:'.$publicDecrypt.'<br>'; $publicEncrypt = $rsa->publicEncrypt(json_encode($data)); echo '公鑰加密後:'.$publicEncrypt.'<br>'; $privDecrypt = $rsa->privDecrypt($publicEncrypt); echo '私鑰解密後:'.$privDecrypt.'<br>';
代碼截圖實例:
轉載自:
做者:明月輕倚深秋
連接:https://www.jianshu.com/p/9dc5c8a93308
來源:簡書