一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - ThinkPHP實現的rsa非對稱加密類示例

ThinkPHP實現的rsa非對稱加密類示例

2019-09-30 17:27錚亮不銹 PHP教程

這篇文章主要介紹了ThinkPHP實現的rsa非對稱加密類,結合實例形式分析了thinkPHP引入密鑰文件實現rsa加密解密的相關操作技巧,需要的朋友可以參考下

本文實例講述了ThinkPHP實現的rsa非對稱加密類。分享給大家供大家參考,具體如下:

公鑰加密后的字符串是一直變化的,但是用私鑰解密后的內容仍然是相同的,這是為了加密數據使用的。

私鑰加密的字符串是不會變化的,即使暴露在外網上別人截取時如果沒有公鑰也是看不出來內容的,僅允許給予公鑰的第三方來解密并看到內容,實際作用相當于簽名功能,如果能拿到未加密的內容,說明一定是信任方的數據,因為有他的簽名啊。

其實這種非對稱加密技術可以用于單點登錄中去,安全級別高,能解密獲取到內容應該就是信任方的數據。

<?php
namespace Common\Org;
class RsaCrypt {
 const CERPATH ='../Application/Runtime/Data/server.cer'; //生成證書路徑
 const PFXPATH = '../Application/Runtime/Data/server.pfx'; //秘鑰文件路徑
 const FILEDIR = '../Application/Runtime/Data/';
  /**
  * 生成公鑰私鑰
  */
  public static function generateCertKey()
  {
  $dn = array('countryName'=>'CN', 'stateOrProvinceName'=>'beijing', 'localityName'=>'beijing','organizationName'=>'clcw',
    'organizationalUnitName'=>'clcw', 'commonName'=>'clcw', 'emailAddress'=>'[email protected]');
  $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)) 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, $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 $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, $encryptData, $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, $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;
  }
}

希望本文所述對大家基于ThinkPHP框架的PHP程序設計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 非洲黑人bbwbbwbbw | 插鸡视频在线观看 | 范冰冰好紧好滑好湿 | 日韩一卡2卡3卡新区网站 | 护士的小嫩嫩好紧好舒服 | 日韩xx00| 午夜在线观看免费完整直播网页 | 欧美色fx性乌克兰 | 白丝尤物的下面被疯狂蹂躏 | 午夜影院h | 精品网站一区二区三区网站 | 国产精品天天看特色大片不卡 | 天天综合色天天综合色sb | 91久久偷偷做嫩草影院免费 | 久久永久免费视频 | 国产欧美日韩精品一区二区三区 | 手机看片日韩1024你懂的首页 | 国产午夜精品久久理论片 | heyzo在线播放 | 极品91 | 麻豆自拍 | 喷潮女王cytherea全部视频 | 青草草视频在线观看 | 99自拍视频在线观看 | 亚洲高清中文字幕一区二区三区 | 好姑娘在线视频观看免费 | 成人观看免费大片在线观看 | 97超pen个人视频公开视频视 | bl双性受乖调教改造身体 | 欧美日韩精品在线视频 | 小早川怜子息梦精在线播放 | 国产欧美综合精品一区二区 | 深夜网站在线观看 | 国产一成人精品福利网站 | 久见久热 这里只有精品 | 国产精品一区牛牛影视 | 99re思思| 猛操美女| 精品精品国产自在现拍 | bban女同系列022在线观看 | 日本免费一区二区三区四区五六区 |