主頁 > 知識庫 > 詳解PHP使用非對稱加密算法RSA

詳解PHP使用非對稱加密算法RSA

熱門標(biāo)簽:科大訊飛語音識別系統(tǒng) 團購網(wǎng)站 電子圍欄 銀行業(yè)務(wù) 服務(wù)器配置 阿里云 Mysql連接數(shù)設(shè)置 Linux服務(wù)器

加密的類型

在日常設(shè)計及開發(fā)中,為確保數(shù)據(jù)傳輸和數(shù)據(jù)存儲的安全,可通過特定的算法,將數(shù)據(jù)明文加密成復(fù)雜的密文。目前主流加密手段大致可分為單向加密和雙向加密。

單向加密:通過對數(shù)據(jù)進行摘要計算生成密文,密文不可逆推還原。算法代表:Base64,MD5,SHA;

雙向加密:與單向加密相反,可以把密文逆推還原成明文,雙向加密又分為對稱加密和非對稱加密。

對稱加密:指數(shù)據(jù)使用者必須擁有相同的密鑰才可以進行加密解密,就像彼此約定的一串暗號。算法代表:DES,3DES,AES,IDEA,RC4,RC5;

非對稱加密:相對對稱加密而言,無需擁有同一組密鑰,非對稱加密是一種“信息公開的密鑰交換協(xié)議”。非對稱加密需要公開密鑰和私有密鑰兩組密鑰,公開密鑰和私有密鑰是配對起來的,也就是說使用公開密鑰進行數(shù)據(jù)加密,只有對應(yīng)的私有密鑰才能解密。這兩個密鑰是數(shù)學(xué)相關(guān),用某用戶密鑰加密后的密文,只能使用該用戶的加密密鑰才能解密。如果知道了其中一個,并不能計算出另外一個。因此如果公開了一對密鑰中的一個,并不會危害到另外一個密鑰性質(zhì)。這里把公開的密鑰為公鑰,不公開的密鑰為私鑰。算法代表:RSA,DSA。

以前一直對客戶端傳給服務(wù)器的信息加密這一塊一臉懵,如果app里面的用戶登錄信息被抓包拿到了,大寫著 username:root,password:123456,  那不是很尷尬。

偶然做版權(quán)輸入的時候遇到了rsa,在支付寶支付的時候也接觸過,當(dāng)時不知道這是啥子,現(xiàn)在才知道。

他能保證,客戶端給出的信息,只有擁有私鑰的服務(wù)器才能看,其他人看的都是亂碼。

非對稱加密算法

需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數(shù)據(jù)進行加密,只有用對應(yīng)的私有密鑰才能解密;如果用私有密鑰對數(shù)據(jù)進行加密,那么只有用對應(yīng)的公開密鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。

注意以上的一個點,公鑰加密的數(shù)據(jù),只有對應(yīng)的私鑰才能解密

在日常使用中是醬紫的:將私鑰private_key.pem用在服務(wù)器端,公鑰發(fā)放給android跟ios等前端

客戶端用公鑰加密過后,數(shù)據(jù)只能被擁有唯一私鑰的服務(wù)器看懂。

具體實現(xiàn)

1、加密解密的第一步

生成公鑰、私鑰對,私鑰加密的內(nèi)容能通過公鑰解密(反過來亦可以)

下載開源RSA密鑰生成工具openssl(通常Linux系統(tǒng)都自帶該程序),解壓縮至獨立的文件夾,進入其中的bin目錄,執(zhí)行以下命令:

openssl genrsa -out rsa_private_key.pem 1024

openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

第一條命令生成原始 RSA私鑰文件 rsa_private_key.pem

第二條命令將原始 RSA私鑰轉(zhuǎn)換為 pkcs8格式

第三條生成RSA公鑰 rsa_public_key.pem

上面幾個就可以看出:通過私鑰能生成對應(yīng)的公鑰

也有一些網(wǎng)站提供生成rsa公鑰私鑰的服務(wù):http://www.bm8.com.cn/webtool/rsa/

2、PHP的加密解密類庫

?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;    
    }
}

調(diào)用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>';

代碼截圖實例:

以上就是PHP使用非對稱加密算法RSA的詳細內(nèi)容,更多關(guān)于PHP使用RSA的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • 詳解各種PHP函數(shù)漏洞
  • 如何使用SublimeText3配置 PHP IDE環(huán)境
  • PHPStorm+Xdebug進行emote Debug時無法進入斷點問題排查
  • php中foreach遍歷類對象的總結(jié)
  • php-fpm報502問題的解決辦法
  • PHP實現(xiàn)創(chuàng)建以太坊錢包轉(zhuǎn)賬等功能
  • 如何使用php生成zip壓縮包
  • php常見的網(wǎng)絡(luò)攻擊及防御方法
  • PHP7下安裝并使用xhprof性能分析工具
  • PHP遠程調(diào)用以及RPC框架
  • PHP代碼加密和擴展解密實戰(zhàn)
  • 再談PHP未來之路

標(biāo)簽:衡水 廣元 江蘇 蚌埠 大理 萍鄉(xiāng) 棗莊 衢州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解PHP使用非對稱加密算法RSA》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266