摘要:公钥密码加密和解密使用不同的密码的方式,因此公钥密码通常也称为非对称密码,常用的算法有。其中用公钥加密需要私钥解密,称为加密。由于私钥是不公开的,确保了内容的保密,没有私钥无法获得内容用私钥加密需要公钥解密,称为签名。
1.什么是RSA加密
RSA (详见维基百科)算法是现今使用最广泛的公钥密码算法,也是号称地球上最安全的加密算法,与 md5 和 sha1 不同,到目前为止,也只有极短的RSA加密被破解。
那么什么是公匙密码算法呢,根据密钥的使用方法,可以将密码分为对称密码和公钥密码,接下来我们来简单说明下它们两个。
对称密码:加密和解密使用同一种密钥的方式,常用的算法有 DES 以及 AES。
公钥密码:加密和解密使用不同的密码的方式,因此公钥密码通常也称为非对称密码,常用的算法有 RSA。
由于本文讨论的是 php 的 RSA 加密实例,这里就不详细说明了,对于 RSA 算法有兴趣的朋友可以查看下面的文章
《带你彻底理解RSA算法原理》
对于 php 更多加密方式有兴趣的朋友可以查看下面的文章
《PHP数据加密技术与密钥安全管理》
为移动端(IOS,安卓)编写 API 接口
进行支付、真实信息验证等安全性需求较高的通信
与其他第三方或合作伙伴进行重要的数据传输
3.生成私钥、公钥既然 RSA 是非对称加密,那么就先必须生成所需要的私钥和公钥,以 ubuntu 为例。首先下载开源 RSA 密钥生成工具 openssl (通常为 linux 系统自带),如果没有,可以通过以下命令进行安装
apt-get install openssl
当 openssl 安装完毕后,我们就可以开始生成私钥、公钥了。首先,生成原始 RSA 私钥文件
openssl genrsa -out rsa_private_key.pem 1024
注:这里生成了一个长度为 1024bit 的密钥,转化为字节就是 128byte
其次,将原始 RSA 私钥转换为 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
在需要使用的时候,我们将私钥 rsa_private_key.pem 放在服务器端,公钥发放给需要与我们进行加密通信的一方就可以了。
4.php-rsa 加密解密实例现在我们可以使用 php 进行 RSA 的加密解密了,但在此之前,你首先要看看你有没有安装或开启 php 的 openssl 扩展,可以通过文件输出 phpinfo() 或者通过命令行输出 php -m | less 来查看是否安装开启了此扩展,也可以通过 extension_loaded() 函数来判断扩展是否开启,如果没有,则通过该命令进行安装(以 ubuntu 为例):
apt-get install php7.0-openssl
当然,如果你是 Windows 操作系统,可以下载对应版本的 php_openssl.dll。
好了,现在我们来编写一个 php-RSA 的服务器类库,这个类库的工作其实很简单,就是封装一些 php 针对 RSA 操作的函数,方便我们加密解密。
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 获取文件内容 * @param $file_path string * @return bool|string */ private function _getContents($file_path) { file_exists($file_path) or die ("密钥或公钥的文件路径错误"); 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; } }
好了,现在我们调用 Rsa 类,对数据进行加密解密
$private_key = "private_key.pem"; // 私钥路径 $public_key = "rsa_public_key.pem"; // 公钥路径 $rsa = new Rsa($private_key, $public_key); $origin_data = "这是一条测试数据"; $ecryption_data = $rsa->privEncrypt($origin_data); $decryption_data = $rsa->publicDecrypt($ecryption_data); echo "私钥加密后的数据为:" . $ecryption_data; echo PHP_EOL; echo "公钥解密后的数据为: " . $decryption_data; echo PHP_EOL;
最后我们看到输出:
最后要说明的是,公钥、私钥都可以加密,也都可以解密。其中:用公钥加密需要私钥解密,称为“加密”。由于私钥是不公开的,确保了内容的保密,没有私钥无法获得内容;用私钥加密需要公钥解密,称为“签名”。由于公钥是公开的,任何人都可以解密内容,但只能用发布者的公钥解密,验证了内容是该发布者发出的。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/26126.html
摘要:简介地址实际项目中的登陆认证接口调用支付接口调用等场合经常涉及到等算法。各大银行接口中经常使用算法对调用接口参数进行签名防篡改。使用端见端见特点便于理解,使用广泛。这就使加密的计算量很大。对方收到信息后,用不同的密钥解密并可核对信息摘要。 PHP-RSA简介 github 地址 https://github.com/lmxdawn/PH... 实际项目中的登陆认证、web api接口调...
摘要:简介地址实际项目中的登陆认证接口调用支付接口调用等场合经常涉及到等算法。各大银行接口中经常使用算法对调用接口参数进行签名防篡改。使用端见端见特点便于理解,使用广泛。这就使加密的计算量很大。对方收到信息后,用不同的密钥解密并可核对信息摘要。 PHP-RSA简介 github 地址 https://github.com/lmxdawn/PH... 实际项目中的登陆认证、web api接口调...
摘要:简介地址实际项目中的登陆认证接口调用支付接口调用等场合经常涉及到等算法。各大银行接口中经常使用算法对调用接口参数进行签名防篡改。使用端见端见特点便于理解,使用广泛。这就使加密的计算量很大。对方收到信息后,用不同的密钥解密并可核对信息摘要。 PHP-RSA简介 github 地址 https://github.com/lmxdawn/PH... 实际项目中的登陆认证、web api接口调...
摘要:什么是是在原来签名算法的基础上,新增了支持的签名算法。的签名算法会继续提供支持,但为了您的应用安全,强烈建议使用的签名算法。 什么是RSA2? RSA2是在原来SHA1WithRSA签名算法的基础上,新增了支持SHA256WithRSA的签名算法。 该算法在摘要算法上比SHA1WithRSA有更强的安全能力。 SHA1WithRSA的签名算法会继续提供支持,但为了您的应用安全,强烈建议...
摘要:所谓对称加密,就是加密和解密使用同一秘钥,这也是这种加密算法最显著的缺点之一。非对称加密算法由于对称加密在通信加密领域的缺陷,年和提出了非对称加密的概念。非对称加密,其主要缺点之一就是慢,适合加密少量数据。 1. 加密的目的 加密不同于密码,加密是一个动作或者过程,其目的就是将一段明文信息(人类或机器可以直接读懂的信息)变为一段看上去没有任何意义的字符,必须通过事先约定的解密规则才能将...
阅读 2732·2021-09-02 15:11
阅读 905·2019-08-26 18:18
阅读 1866·2019-08-26 11:57
阅读 3317·2019-08-23 16:59
阅读 1993·2019-08-23 16:51
阅读 2305·2019-08-23 16:11
阅读 3120·2019-08-23 14:58
阅读 1106·2019-08-23 11:34