程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP的學習--RSA加密解密

PHP的學習--RSA加密解密

編輯:PHP綜合

PHP服務端與客戶端交互或者提供開放API時,通常需要對敏感的數據進行加密,這時候rsa非對稱加密就能派上用處了。

舉個通俗易懂的例子,假設我們再登錄一個網站,發送賬號和密碼,請求被攔截了。

  • 密碼沒加密,那攻擊者就直接拿到了密碼,這是最搓的。
  • 密碼加密了,是不可逆加密,那攻擊者只需要模擬那個請求即可登錄。
  • 密碼加密了,是可逆加密,其中攜帶有時間等參數,後台可以根據時間等參數來判斷是否有效,但因為是在前端加密,其加密方式也能在代碼中找到,找到加密方式就可以得出解密方式。

但是如果我們使用非對稱加密就可以避免以上問題。

非對稱加密算法需要兩個密鑰來進行加密和解密,這兩個秘鑰是公開密鑰(public key,簡稱公鑰)和私有密鑰(private key,簡稱私鑰)。

工作過程如下,甲乙之間使用非對稱加密的方式完成了重要信息的安全傳輸。

非對稱加密工作過程簡要示意圖

  • 乙方生成一對密鑰(公鑰和私鑰)並將公鑰向其它方公開。
  • 得到該公鑰的甲方使用該密鑰對機密信息進行加密後再發送給乙方。
  • 乙方再用自己保存的另一把專用密鑰(私鑰)對加密後的信息進行解密。乙方只能用其專用密鑰(私鑰)解密由對應的公鑰加密後的信息。

在傳輸過程中,即使攻擊者截獲了傳輸的密文,並得到了乙的公鑰,也無法破解密文,因為只有乙的私鑰才能解密密文。
同樣,如果乙要回復加密信息給甲,那麼需要甲先公布甲的公鑰給乙用於加密,甲自己保存甲的私鑰用於解密。

在非對稱加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(橢圓曲線加密算法)等。

下面我們通過一個例子來說明如何用PHP來實現RSA的加密解密。

<?php
class Rsa
{
    public $privateKey = '';

    public $publicKey = '';
    
    public function __construct()
    {
        $resource = openssl_pkey_new();
        openssl_pkey_export($resource, $this->privateKey);
        $detail = openssl_pkey_get_details($resource);
        $this->publicKey = $detail['key'];
    }

    public function publicEncrypt($data, $publicKey)
    {
        openssl_public_encrypt($data, $encrypted, $publicKey);
        return $encrypted;
    }

    public function publicDecrypt($data, $publicKey)
    {
        openssl_public_decrypt($data, $decrypted, $publicKey);
        return $decrypted;
    }

    public function privateEncrypt($data, $privateKey)
    {
        openssl_private_encrypt($data, $encrypted, $privateKey);
        return $encrypted;
    }

    public function privateDecrypt($data, $privateKey)
    {
        openssl_private_decrypt($data, $decrypted, $privateKey);
        return $decrypted;
    }
}


$rsa = new Rsa();
echo "公鑰加密:\n", $rsa->publicKey, "\n";
echo "私鑰加密:\n", $rsa->privateKey, "\n";

// 使用公鑰加密
$str = $rsa->publicEncrypt('hello', $rsa->publicKey);
// 這裡使用base64是為了不出現亂碼,默認加密出來的值有亂碼
$str = base64_encode($str);
echo "公鑰加密(base64處理過):\n", $str, "\n";
$str = base64_decode($str);
$pubstr = $rsa->publicDecrypt($str, $rsa->publicKey);
echo "公鑰解密:\n", $pubstr, "\n";
$privstr = $rsa->privateDecrypt($str, $rsa->privateKey);
echo "私鑰解密:\n", $privstr, "\n";

// 使用私鑰加密
$str = $rsa->privateEncrypt('world', $rsa->privateKey);
// 這裡使用base64是為了不出現亂碼,默認加密出來的值有亂碼
$str = base64_encode($str);
echo "私鑰加密(base64處理過):\n", $str, "\n";
$str = base64_decode($str);
$pubstr = $rsa->publicDecrypt($str, $rsa->publicKey);
echo "公鑰解密:\n", $pubstr, "\n";
$privstr = $rsa->privateDecrypt($str, $rsa->privateKey);
echo "私鑰解密:\n", $privstr, "\n";

大家執行一下可以看到公鑰加密的數據,只有私鑰能解密,反之亦然,私鑰加密的數據只有公鑰能解碼。

執行結果如下:

這是PHP端的實現,可用在第三方跟平台之間的數據傳輸,但如果是前端傳到後端該怎麼辦呢,搜索了一下,發現了這個庫jsencrypt,但其實現與PHP不太一致。

如果大家需要用到可以參考這篇博客《JS到PHP使用RSA算法進行加密通訊》

參考摘錄:

百度百科 非對稱加密
PHP文檔 加密擴展


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved