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,$privkey,$privkeypass); (file_exists(self::CERPATH))ordie('公钥的文件路径错误'); (file_exists(self::PFXPATH))ordie('密钥的文件路径错误'); } publicstaticfunctionverifyData($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$appNamestring应用名称 */ publicstaticfunctiongenerateKey($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){ //thrownew\Exception($e->getMessage()); $result['msg']=$e->getMessage(); } return$result; } /** *用私钥加密数据 *@param$datastring需要加密的字符串(最好不要超过200个字符) *@param$appNamestring应用名称 */ publicstaticfunctionprivateEncrypt($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$datastring需要解密的字符串(最好不要超过200个字符) *@param$appNamestring应用名称 */ publicstaticfunctionpublicDecrypt($data,$appName) { $result=['status'=>0,'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,$decryptData,$publickey)){ $result['msg']=$decryptData; $result['status']=1; }else{ $result['msg']='解密失败'; } return$result; } /** *用公钥加密数据 *@param$datastring需要加密的字符串(最好不要超过200个字符) *@param$appNamestring应用名称 */ publicstaticfunctionpublicEncrypt($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,$encryptData,$publickey)){ $result['msg']=base64_encode($encryptData); $result['status']=1; }else{ $result['msg']='加密失败!'; } return$result; } /** *用私钥加密数据 *@param$datastring需要解密的字符串(最好不要超过200个字符) *@param$appNamestring应用名称 */ publicstaticfunctionprivateDecrypt($data,$appName) { $result=['status'=>0,'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,$decryptData,$privatekey)){ $result['msg']=$decryptData; $result['status']=1; }else{ $result['msg']='解密失败'; } return$result; } }
PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:
在线RSA加密/解密工具:
http://tools.jb51.net/password/rsa_encode
文字在线加密解密工具(包含AES、DES、RC4等):
http://tools.jb51.net/password/txt_encode
在线散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt
在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha
在线sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode
更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《ZendFrameWork框架入门教程》及《PHP模板技术总结》。
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。