加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

ThinkPHP实现的rsa非对称加密类示例

发布时间:2020-12-14 14:10:26 所属栏目:大数据 来源:网络整理
导读:本篇章节讲解ThinkPHP实现的rsa非对称加密类。供大家参考研究具体如下: 公钥加密后的字符串是一直变化的,但是用私钥解密后的内容仍然是相同的,这是为了加密数据使用的。 私钥加密的字符串是不会变化的,即使暴露在外网上别人截取时如果没有公钥

本篇章节讲解ThinkPHP实现的rsa非对称加密类。分享给大家供大家参考,具体如下:

公钥加密后的字符串是一直变化的,但是用私钥解密后的内容仍然是相同的,这是为了加密数据使用的。

私钥加密的字符串是不会变化的,即使暴露在外网上别人截取时如果没有公钥也是看不出来内容的,仅允许给予公钥的第三方来解密并看到内容,实际作用相当于签名功能,如果能拿到未加密的内容,说明一定是信任方的数据,因为有他的签名啊。

其实这种非对称加密技术可以用于单点登录中去,安全级别高,能解密获取到内容应该就是信任方的数据。

'CN','stateOrProvinceName'=>'beijing','localityName'=>'beijing','organizationName'=>'clcw','organizationalUnitName'=>'clcw','commonName'=>'clcw','emailAddress'=>'service@clcw.com.cn'); $privkeypass = 'secret'; //私钥密码 $numberOfDays = 365; //有效时长,单位为天 //生成证书 $privkey = openssl_pkey_new(); $csr = openssl_csr_new($dn,$privkey); $sscert = openssl_csr_sign($csr,null,$privkey,$numberOfDays); openssl_x509_export_to_file($sscert,self::CERPATH); openssl_pkcs12_export_to_file($sscert,self::PFXPATH,$privkeypass); (file_exists(self::CERPATH)) or die('公钥的文件路径错误'); (file_exists(self::PFXPATH)) or die('密钥的文件路径错误'); } public static function verifyData($originData,$decryptData) { $cer_key = file_get_contents(self::$cerpath); $cer = openssl_x509_read($cer_key); $res = openssl_verify($originData,$decryptData,$cer); var_dump($res); } /** * 生成公钥私钥文件 * @param $appName string 应用名称 */ public static function generateKey($appName='') { $result = ['status'=>0,'msg'=>'']; if (!extension_loaded('openssl') ) { $result['msg'] = 'php需要openssl支持'; } //创建公钥 $res = openssl_pkey_new();//array('private_key_bits'=>512) 这一串参数不加,否则只能加密54个长度的字符串 //提取私钥 openssl_pkey_export($res,$privatekey); //生成公钥 $public_key = openssl_pkey_get_details($res); $publickey = $public_key['key']; // $path = self::FILEDIR.$appName; try{ // file_put_contents($path.'_public.pem',$publickey); // file_put_contents($path.'_private.pem',$privatekey); $result['status'] = 1; $result['publickey'] = $publickey; $result['privatekey'] = $privatekey; }catch(Exception $e) { // throw new Exception($e->getMessage()); $result['msg'] = $e->getMessage(); } return $result; } /** * 用私钥加密数据 * @param $data string 需要加密的字符串(最好不要超过200个字符) * @param $appName string 应用名称 */ public static function privateEncrypt($data,$appName) { $result = ['status'=>0,'msg'=>'']; $privatekey = C($appName.'.PRIVATE_KEY'); $myinfo = 'In '.__METHOD__.',privatekey:'.$privatekey."n"; file_put_contents('/tmp/shiyf.log',$myinfo,FILE_APPEND); //生成resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false $privatekey = openssl_pkey_get_private($privatekey); if (empty($privatekey)) { $result['msg'] = '密钥不可用'; } $encryptData = ''; //用私钥加密 if (openssl_private_encrypt($data,$encryptData,$privatekey)) { $result['msg'] = base64_encode($encryptData); $result['status'] = 1; } else { $result['msg'] = '加密失败!'; } return $result; } /** * 用公钥解密数据 * @param $data string 需要解密的字符串(最好不要超过200个字符) * @param $appName string 应用名称 */ public static function publicDecrypt($data,'msg'=>'']; $data = base64_decode($data); $publickey = C($appName.'.PUBLIC_KEY'); //生成resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false $publickey = openssl_pkey_get_public($publickey); if (empty($publickey)) { $result['msg'] = '公钥不可用'; } //解密数据 $decryptData = ''; if (openssl_public_decrypt($data,$publickey)) { $result['msg'] = $decryptData; $result['status'] = 1; } else { $result['msg'] = '解密失败'; } return $result; } /** * 用公钥加密数据 * @param $data string 需要加密的字符串(最好不要超过200个字符) * @param $appName string 应用名称 */ public static function publicEncrypt($data,$publickey) { $result = ['status'=>0,'msg'=>'']; //生成resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_private函数返回false $publickey = openssl_pkey_get_public($publickey); if (empty($publickey)) { $result['msg'] = '公钥不可用'; } $encryptData = ''; //用私钥加密 if (openssl_public_encrypt($data,$publickey)) { $result['msg'] = base64_encode($encryptData); $result['status'] = 1; } else { $result['msg'] = '加密失败!'; } return $result; } /** * 用私钥加密数据 * @param $data string 需要解密的字符串(最好不要超过200个字符) * @param $appName string 应用名称 */ public static function privateDecrypt($data,'msg'=>'']; $data = base64_decode($data); $privatekey = C($appName.'.PRIVATE_KEY'); //生成resource类型的私钥,如果私钥文件内容被破坏,openssl_pkey_get_public函数返回false $privatekey = openssl_pkey_get_private($privatekey); if (empty($privatekey)) { $result['msg'] = '私钥不可用'; } //解密数据 $decryptData = ''; if (openssl_private_decrypt($data,$privatekey)) { $result['msg'] = $decryptData; $result['status'] = 1; } else { $result['msg'] = '解密失败'; } return $result; } }

PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:

在线RSA加密/解密工具:

文字在线加密解密工具(包含AES、DES、RC4等):

在线散列/哈希算法加密工具:

在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:

在线sha1/sha224/sha256/sha384/sha512加密工具:

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》及《》。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读