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文檔 加密擴展