久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

Laravel中encrypt和decrypt的實(shí)現(xiàn)方法

這篇文章主要給大家介紹了關(guān)于Laravel中encrypt和decrypt的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一

前言

Laravel 的加密機(jī)制使用 OpenSSL 提供 AES-256 和 AES-128 的加密,本文將詳細(xì)介紹關(guān)于Laravel中encrypt和decrypt的實(shí)現(xiàn),分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。

1. 使用方法

首先是生成秘鑰。要需要在.env目錄里提供APP_KEY,這個(gè)如果沒有的話,可以通過(guò)命令php artisan key:generate生成,也可以自己設(shè)置。生成后例子應(yīng)該是這樣的

APP_KEY=base64:5BM1BXGOBrGeeqJMAWJZSzyzh5yPcCGOcOGPtUij65g=

在文件配置加密key和加密算法,在config/app.php的目錄里有配置

$ 'key' => env('APP_KEY'),
 
  'cipher' => 'AES-256-CBC',

使用方法,在laravel里已經(jīng)有使用方法了,這里就不在過(guò)多的說(shuō)了。主要使用的兩個(gè)方法,一個(gè)是encrypt的加密,一個(gè)是decrypt的解密

2. 查找加密解密的文件

實(shí)現(xiàn)方法的位置是在vendor/illuminate/encryption/的目錄下發(fā)現(xiàn)兩個(gè)文件,一個(gè)是EncryptionServiceProvider另外一個(gè)是Encrypter

3. 分析EncryptionServiceProvider文件

 public function register()
 {
  $this->app->singleton('encrypter', function ($app) {
   $config = $app->make('config')->get('app'); //從config/app.php里拿到配置文件

   if (Str::startsWith($key = $config['key'], 'base64:')) { //分析配置文件里的key里面有沒有帶'base64'
    $key = base64_decode(substr($key, 7)); //如果有的話,把key前面的base64:給取消,并且解析出原來(lái)的字符串
   }

   return new Encrypter($key, $config['cipher']); //實(shí)例化Encrypte類,注入到框架里
  });
 }

這個(gè)文件沒太多東西,但是通過(guò)這個(gè)我們可以看出,其實(shí)在配置文件的,我們能直接寫key,并且前面不帶base64也是可以解析。相當(dāng)于省幾步操作

另外,在實(shí)例化類的時(shí)候,需要傳入key以及加密方式

4. 分析Encrypter文件

1. 分析__construct,在實(shí)例化之前執(zhí)行

 public function __construct($key, $cipher = 'AES-128-CBC')
 {
  $key = (string) $key; //把key轉(zhuǎn)換為字符串

  if (static::supported($key, $cipher)) { //調(diào)用一個(gè)自定義的方法,用來(lái)判斷加密方式和要求的key長(zhǎng)度是否一樣
   $this->key = $key;
   $this->cipher = $cipher;
  } else {
   throw new RuntimeException('The only supported ciphers are AES-128-CBC and AES-256-CBC with the correct key lengths.');
  }
 }

上面的方法,主要是用來(lái)判斷加密方式和傳的key的長(zhǎng)度是否相同,因?yàn)椴煌募用芊绞剑蟮南鄳?yīng)的key的長(zhǎng)度也是有要求的,具體每種加密方式要求key的長(zhǎng)度可以查找對(duì)應(yīng)的文檔

 public static function supported($key, $cipher)
 {
  $length = mb_strlen($key, '8bit'); //判斷key的字符的長(zhǎng)度,按照8bit位的方式計(jì)算字符長(zhǎng)度

  return ($cipher === 'AES-128-CBC' && $length === 16) ||
    ($cipher === 'AES-256-CBC' && $length === 32); //編碼格式為AES128的要求字符長(zhǎng)度為16。編碼格式為AES256的要求字符長(zhǎng)度為32位
 }

上面這個(gè)方法展現(xiàn)了一個(gè)嚴(yán)謹(jǐn)?shù)牡胤?,用了mb_strlen方法,并且要求計(jì)算長(zhǎng)度是按照8bit位來(lái)計(jì)算的。這樣的好處是,不管是在哪種操作系統(tǒng),計(jì)算的長(zhǎng)度都是一樣的。

通過(guò)這個(gè)考慮到不同操作系統(tǒng)的情況,不會(huì)出現(xiàn)加密出現(xiàn)問(wèn)題的情況。

2. 分析encrypt方法

 public function encrypt($value, $serialize = true)
 {
  $iv = random_bytes(16); //生成一個(gè)16位的隨機(jī)字符串
  
  
  // 使用openssl_encrypt把數(shù)據(jù)生成一個(gè)加密的數(shù)據(jù)
  // 1、判斷需要不需要生成一個(gè)可存儲(chǔ)表示的值,這樣做是為了不管你的數(shù)據(jù)是數(shù)組還是字符串都能給你轉(zhuǎn)成一個(gè)字符串,不至于在判斷你傳過(guò)來(lái)的數(shù)據(jù)是數(shù)組還是字符串了。
  // 2、使用openssl_encrypt。第一個(gè)參數(shù)是傳入數(shù)據(jù),第二個(gè)參數(shù)是傳入加密方式,目前使用AES-256-CBC的加密方式,第三個(gè)參數(shù)是,返回加密后的原始數(shù)據(jù),還是把加密的數(shù)據(jù)在經(jīng)過(guò)一次base64的編碼,0的話表示base64位數(shù)據(jù)。第四個(gè)參數(shù)是項(xiàng)量,這個(gè)參數(shù)傳入隨機(jī)數(shù),是為了在加密數(shù)據(jù)的時(shí)候每次的加密數(shù)據(jù)都不一樣。
  $value = \openssl_encrypt(
   $serialize ? serialize($value) : $value,
   $this->cipher, $this->key, 0, $iv
  ); //使用AES256加密內(nèi)容

  if ($value === false) {
   throw new EncryptException('Could not encrypt the data.');
  }

  $mac = $this->hash($iv = base64_encode($iv), $value); //生成一個(gè)簽名,用來(lái)保證內(nèi)容參數(shù)沒有被更改

  $json = json_encode(compact('iv', 'value', 'mac')); //把隨機(jī)碼,加密內(nèi)容,已經(jīng)簽名,組成數(shù)組,并轉(zhuǎn)成json格式

  if (! is_string($json)) {
   throw new EncryptException('Could not encrypt the data.');
  }

  return base64_encode($json); //把json格式轉(zhuǎn)換為base64位,用于傳輸
 }
【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過(guò)測(cè)試外,其他素材未做測(cè)試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請(qǐng)勿用于商業(yè)用途。如損害你的權(quán)益請(qǐng)聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

下面小編就為大家分享一篇laravel ORM 只開啟created_at的幾種方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
這篇文章主要給大家介紹了如何通過(guò)源碼解析Laravel的依賴注入的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著
這篇文章主要給大家介紹了關(guān)于Laravel中unique和exists驗(yàn)證規(guī)則的優(yōu)化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面
最近在使用laravel5.5,利用其實(shí)現(xiàn)了一個(gè)功能,下面分享給大家,這篇文章主要給大家介紹了關(guān)于Laravel 5.5基于內(nèi)置的Auth模塊如何實(shí)現(xiàn)前后臺(tái)登陸的相關(guān)資料,文中通過(guò)示例代碼介紹的非
laravel 的隊(duì)列服務(wù)對(duì)各種不同的后臺(tái)隊(duì)列服務(wù)提供了統(tǒng)一的 API,下面這篇文章通過(guò)源碼分析給大家介紹了關(guān)于 Laravel 重復(fù)執(zhí)行同一個(gè)隊(duì)列任務(wù)的原因,文中通過(guò)示例代碼介紹的非常詳細(xì)
這篇文章主要給大家介紹了關(guān)于 Laravel Redis 多個(gè)進(jìn)程同時(shí)取隊(duì)列問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面來(lái)
主站蜘蛛池模板: av资源在线 | 538精品视频 | 日韩高清毛片 | 日韩高清一区 | 黄色a毛片| 九色av| 久久久亚洲精品视频 | 国产欧美久久久 | 国产视频一区二区在线观看 | 欧美三级韩国三级日本三斤在线观看 | 国产黄色片在线观看 | 日本中文在线 | 欧美日韩国产在线 | 日韩一区三区 | 国产福利在线播放 | 少妇视频在线观看 | 91麻豆精品视频 | 亚洲视频免费观看 | 日本免费中文字幕 | 天天干网站 | 免费一级黄色 | 狠狠干伊人 | 五月播播 | 国产精品自拍小视频 | 国产日韩久久 | 国产日韩欧美在线 | 日韩精品视频在线免费观看 | 韩国免费理论片 | 国产人成| 精品毛片一区二区三区 | 日本中文字幕网站 | 黄色片观看 | 亚洲h视频 | 日韩成人精品 | 亚洲精选一区 | 91日韩在线 | 日韩亚洲天堂 | 欧美日韩中文字幕在线 | 亚洲另类色图 | 国内精品偷拍 | 秋霞午夜鲁丝一区二区老狼 |