摘要:公鑰密碼加密和解密使用不同的密碼的方式,因此公鑰密碼通常也稱為非對(duì)稱密碼,常用的算法有。其中用公鑰加密需要私鑰解密,稱為加密。由于私鑰是不公開(kāi)的,確保了內(nèi)容的保密,沒(méi)有私鑰無(wú)法獲得內(nèi)容用私鑰加密需要公鑰解密,稱為簽名。
1.什么是RSA加密
RSA (詳見(jiàn)維基百科)算法是現(xiàn)今使用最廣泛的公鑰密碼算法,也是號(hào)稱地球上最安全的加密算法,與 md5 和 sha1 不同,到目前為止,也只有極短的RSA加密被破解。
那么什么是公匙密碼算法呢,根據(jù)密鑰的使用方法,可以將密碼分為對(duì)稱密碼和公鑰密碼,接下來(lái)我們來(lái)簡(jiǎn)單說(shuō)明下它們兩個(gè)。
對(duì)稱密碼:加密和解密使用同一種密鑰的方式,常用的算法有 DES 以及 AES。
公鑰密碼:加密和解密使用不同的密碼的方式,因此公鑰密碼通常也稱為非對(duì)稱密碼,常用的算法有 RSA。
由于本文討論的是 php 的 RSA 加密實(shí)例,這里就不詳細(xì)說(shuō)明了,對(duì)于 RSA 算法有興趣的朋友可以查看下面的文章
《帶你徹底理解RSA算法原理》
對(duì)于 php 更多加密方式有興趣的朋友可以查看下面的文章
《PHP數(shù)據(jù)加密技術(shù)與密鑰安全管理》
為移動(dòng)端(IOS,安卓)編寫(xiě) API 接口
進(jìn)行支付、真實(shí)信息驗(yàn)證等安全性需求較高的通信
與其他第三方或合作伙伴進(jìn)行重要的數(shù)據(jù)傳輸
3.生成私鑰、公鑰既然 RSA 是非對(duì)稱加密,那么就先必須生成所需要的私鑰和公鑰,以 ubuntu 為例。首先下載開(kāi)源 RSA 密鑰生成工具 openssl (通常為 linux 系統(tǒng)自帶),如果沒(méi)有,可以通過(guò)以下命令進(jìn)行安裝
apt-get install openssl
當(dāng) openssl 安裝完畢后,我們就可以開(kāi)始生成私鑰、公鑰了。首先,生成原始 RSA 私鑰文件
openssl genrsa -out rsa_private_key.pem 1024
注:這里生成了一個(gè)長(zhǎng)度為 1024bit 的密鑰,轉(zhuǎn)化為字節(jié)就是 128byte
其次,將原始 RSA 私鑰轉(zhuǎn)換為 pkcs8 格式
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
最后,生成 RSA 公鑰
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
在需要使用的時(shí)候,我們將私鑰 rsa_private_key.pem 放在服務(wù)器端,公鑰發(fā)放給需要與我們進(jìn)行加密通信的一方就可以了。
4.php-rsa 加密解密實(shí)例現(xiàn)在我們可以使用 php 進(jìn)行 RSA 的加密解密了,但在此之前,你首先要看看你有沒(méi)有安裝或開(kāi)啟 php 的 openssl 擴(kuò)展,可以通過(guò)文件輸出 phpinfo() 或者通過(guò)命令行輸出 php -m | less 來(lái)查看是否安裝開(kāi)啟了此擴(kuò)展,也可以通過(guò) extension_loaded() 函數(shù)來(lái)判斷擴(kuò)展是否開(kāi)啟,如果沒(méi)有,則通過(guò)該命令進(jìn)行安裝(以 ubuntu 為例):
apt-get install php7.0-openssl
當(dāng)然,如果你是 Windows 操作系統(tǒng),可以下載對(duì)應(yīng)版本的 php_openssl.dll。
好了,現(xiàn)在我們來(lái)編寫(xiě)一個(gè) php-RSA 的服務(wù)器類庫(kù),這個(gè)類庫(kù)的工作其實(shí)很簡(jiǎn)單,就是封裝一些 php 針對(duì) RSA 操作的函數(shù),方便我們加密解密。
class Rsa { private $_config = [ "public_key" => "", "private_key" => "", ]; public function __construct($private_key_filepath, $public_key_filepath) { $this->_config["private_key"] = $this->_getContents($private_key_filepath); $this->_config["public_key"] = $this->_getContents($public_key_filepath); } /** * @uses 獲取文件內(nèi)容 * @param $file_path string * @return bool|string */ private function _getContents($file_path) { file_exists($file_path) or die ("密鑰或公鑰的文件路徑錯(cuò)誤"); return file_get_contents($file_path); } /** * @uses 獲取私鑰 * @return bool|resource */ private function _getPrivateKey() { $priv_key = $this->_config["private_key"]; return openssl_pkey_get_private($priv_key); } /** * @uses 獲取公鑰 * @return bool|resource */ private function _getPublicKey() { $public_key = $this->_config["public_key"]; return openssl_pkey_get_public($public_key); } /** * @uses 私鑰加密 * @param string $data * @return null|string */ public function privEncrypt($data = "") { if (!is_string($data)) { return null; } return openssl_private_encrypt($data, $encrypted, $this->_getPrivateKey()) ? base64_encode($encrypted) : null; } /** * @uses 公鑰加密 * @param string $data * @return null|string */ public function publicEncrypt($data = "") { if (!is_string($data)) { return null; } return openssl_public_encrypt($data, $encrypted, $this->_getPublicKey()) ? base64_encode($encrypted) : null; } /** * @uses 私鑰解密 * @param string $encrypted * @return null */ public function privDecrypt($encrypted = "") { if (!is_string($encrypted)) { return null; } return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, $this->_getPrivateKey())) ? $decrypted : null; } /** * @uses 公鑰解密 * @param string $encrypted * @return null */ public function publicDecrypt($encrypted = "") { if (!is_string($encrypted)) { return null; } return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, $this->_getPublicKey())) ? $decrypted : null; } }
好了,現(xiàn)在我們調(diào)用 Rsa 類,對(duì)數(shù)據(jù)進(jìn)行加密解密
$private_key = "private_key.pem"; // 私鑰路徑 $public_key = "rsa_public_key.pem"; // 公鑰路徑 $rsa = new Rsa($private_key, $public_key); $origin_data = "這是一條測(cè)試數(shù)據(jù)"; $ecryption_data = $rsa->privEncrypt($origin_data); $decryption_data = $rsa->publicDecrypt($ecryption_data); echo "私鑰加密后的數(shù)據(jù)為:" . $ecryption_data; echo PHP_EOL; echo "公鑰解密后的數(shù)據(jù)為: " . $decryption_data; echo PHP_EOL;
最后我們看到輸出:
最后要說(shuō)明的是,公鑰、私鑰都可以加密,也都可以解密。其中:用公鑰加密需要私鑰解密,稱為“加密”。由于私鑰是不公開(kāi)的,確保了內(nèi)容的保密,沒(méi)有私鑰無(wú)法獲得內(nèi)容;用私鑰加密需要公鑰解密,稱為“簽名”。由于公鑰是公開(kāi)的,任何人都可以解密內(nèi)容,但只能用發(fā)布者的公鑰解密,驗(yàn)證了內(nèi)容是該發(fā)布者發(fā)出的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26126.html
摘要:簡(jiǎn)介地址實(shí)際項(xiàng)目中的登陸認(rèn)證接口調(diào)用支付接口調(diào)用等場(chǎng)合經(jīng)常涉及到等算法。各大銀行接口中經(jīng)常使用算法對(duì)調(diào)用接口參數(shù)進(jìn)行簽名防篡改。使用端見(jiàn)端見(jiàn)特點(diǎn)便于理解,使用廣泛。這就使加密的計(jì)算量很大。對(duì)方收到信息后,用不同的密鑰解密并可核對(duì)信息摘要。 PHP-RSA簡(jiǎn)介 github 地址 https://github.com/lmxdawn/PH... 實(shí)際項(xiàng)目中的登陸認(rèn)證、web api接口調(diào)...
摘要:簡(jiǎn)介地址實(shí)際項(xiàng)目中的登陸認(rèn)證接口調(diào)用支付接口調(diào)用等場(chǎng)合經(jīng)常涉及到等算法。各大銀行接口中經(jīng)常使用算法對(duì)調(diào)用接口參數(shù)進(jìn)行簽名防篡改。使用端見(jiàn)端見(jiàn)特點(diǎn)便于理解,使用廣泛。這就使加密的計(jì)算量很大。對(duì)方收到信息后,用不同的密鑰解密并可核對(duì)信息摘要。 PHP-RSA簡(jiǎn)介 github 地址 https://github.com/lmxdawn/PH... 實(shí)際項(xiàng)目中的登陸認(rèn)證、web api接口調(diào)...
摘要:簡(jiǎn)介地址實(shí)際項(xiàng)目中的登陸認(rèn)證接口調(diào)用支付接口調(diào)用等場(chǎng)合經(jīng)常涉及到等算法。各大銀行接口中經(jīng)常使用算法對(duì)調(diào)用接口參數(shù)進(jìn)行簽名防篡改。使用端見(jiàn)端見(jiàn)特點(diǎn)便于理解,使用廣泛。這就使加密的計(jì)算量很大。對(duì)方收到信息后,用不同的密鑰解密并可核對(duì)信息摘要。 PHP-RSA簡(jiǎn)介 github 地址 https://github.com/lmxdawn/PH... 實(shí)際項(xiàng)目中的登陸認(rèn)證、web api接口調(diào)...
摘要:什么是是在原來(lái)簽名算法的基礎(chǔ)上,新增了支持的簽名算法。的簽名算法會(huì)繼續(xù)提供支持,但為了您的應(yīng)用安全,強(qiáng)烈建議使用的簽名算法。 什么是RSA2? RSA2是在原來(lái)SHA1WithRSA簽名算法的基礎(chǔ)上,新增了支持SHA256WithRSA的簽名算法。 該算法在摘要算法上比SHA1WithRSA有更強(qiáng)的安全能力。 SHA1WithRSA的簽名算法會(huì)繼續(xù)提供支持,但為了您的應(yīng)用安全,強(qiáng)烈建議...
摘要:所謂對(duì)稱加密,就是加密和解密使用同一秘鑰,這也是這種加密算法最顯著的缺點(diǎn)之一。非對(duì)稱加密算法由于對(duì)稱加密在通信加密領(lǐng)域的缺陷,年和提出了非對(duì)稱加密的概念。非對(duì)稱加密,其主要缺點(diǎn)之一就是慢,適合加密少量數(shù)據(jù)。 1. 加密的目的 加密不同于密碼,加密是一個(gè)動(dòng)作或者過(guò)程,其目的就是將一段明文信息(人類或機(jī)器可以直接讀懂的信息)變?yōu)橐欢慰瓷先](méi)有任何意義的字符,必須通過(guò)事先約定的解密規(guī)則才能將...
閱讀 2745·2021-09-02 15:11
閱讀 918·2019-08-26 18:18
閱讀 1874·2019-08-26 11:57
閱讀 3329·2019-08-23 16:59
閱讀 2005·2019-08-23 16:51
閱讀 2313·2019-08-23 16:11
閱讀 3132·2019-08-23 14:58
閱讀 1113·2019-08-23 11:34