基于YII和OPENSSL 实现非对称加密,找回密码功能

在yii框架下建一个控制器
文件/controllers/OpensslController.php 代码如下. 有备注

<?php
namespace app\controllers;
use \yii\web\Controller;
class OpensslencodeController extends Controller
    public function actionCreatekey(){
        //1.创建一个私钥资源
        $key = openssl_pkey_new();
        //2.保存私钥
        //openssl_pkey_export($key, $out);//$out == 下面这么写入.txt的文本内容
        openssl_pkey_export_to_file($key, './private.txt');
        //3.c取出公钥
        $pub_str = openssl_pkey_get_details($key)['key'];
        //4.保存公钥。提示成功
        file_put_contents('./public.txt', $pub_str);
        return  '还在等什么呢,赶紧去加密吧!<a href="'.\yii\helpers\Url::to(['opensslencode/encode','Get参数1'=>'参数1的结果']).'">快来点我</a>';
    }
    public function actionEncode(){
        //原id  123
        $id = '123';
        //取出公钥,进行加密
        $pub_obj = openssl_get_publickey(file_get_contents('./public.txt'));
        //加密
        openssl_public_encrypt($id, $encode_id, $pub_obj);
        //URL传递第一步,base64; 
        $url = base64_encode($encode_id); //var_dump($url);
        var_dump($url);
        //return '<a target=_blank href="'.\yii\helpers\Url::to(['opensslencode/decode','code' => $url]).'">加完密了。点击我。找回密码</a>';
        return '<a target=_blank href="/web/?r=opensslencode/decode&code='.urlencode($url).'">加完密了。点击我。找回密码</a>';
          
    }
    public function actionDecode(){
        //接到传递过来的 base64之后的code
        $code = ( \yii::$app->request->get('code'));
        //base64解码
        $encode = base64_decode($code);//
        //开始解密,接下来先获取私钥(因为刚才 是 用的公钥加的密)
        $private_key = openssl_get_privatekey(file_get_contents('./private.txt'));
        //私钥解密
        openssl_private_decrypt($encode, $result, $private_key);
         
        return '用户id是'.$result.';这个结果,别人不可能解出来。只有我能解出来。所以说。这个链接是 他本人,从他本人的邮箱中点击的。 相对来说 。安全的很。可以让他直接修改。';
    }
}

 

posted @ 2017-04-28 16:43  calmly  阅读(542)  评论(0编辑  收藏  举报