您好,登錄后才能下訂單哦!
這篇文章主要介紹“Laravel中App_KEY的作用是什么”,在日常操作中,相信很多人在Laravel中App_KEY的作用是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Laravel中App_KEY的作用是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
8月初,Laravel 5.5 和 5.6 收到了與 Cookie 序列化和加密有關(guān)的安全修復(fù)程序。一方面,修復(fù)很簡(jiǎn)單,大多數(shù)應(yīng)用程序可能沒(méi)有受到影響。另一方面,這是一個(gè)嚴(yán)重的安全風(fēng)險(xiǎn),表明我們的社區(qū)需要更好地了解 APP_KEY
的工作方式。
要利用此安全漏洞,需要有人知道您的 APP_KEY
,這就是為什么我要帶您詳細(xì)了解您的密鑰,為什么重要以及如何更改它的原因。
APP_KEY
?應(yīng)用程序密鑰是一個(gè)32位字符的隨機(jī)字符串,存儲(chǔ)在 .env
文件中的 APP_KEY
密鑰中。 Laravel 安裝程序會(huì)自動(dòng)為您生成一個(gè),因此您只會(huì)在克隆現(xiàn)成應(yīng)用程序時(shí)注意到它的缺失。要?jiǎng)?chuàng)建新密鑰,您可以自己生成一個(gè)密鑰并將其粘貼到您的 .env
中,或者可以運(yùn)行 php artisan key:generate
讓 Laravel 為您創(chuàng)建并自動(dòng)插入一個(gè)密鑰。
應(yīng)用程序運(yùn)行后,便會(huì)在一個(gè)地方使用 APP_KEY
:cookie。Laravel 將密鑰用于所有加密的 cookie (包括會(huì)話 cookie),然后再將其交給用戶瀏覽器,并使用它解密從瀏覽器讀取的 cookie。這樣可以防止客戶端更改其 cookie 并為其授予管理員特權(quán)或模擬應(yīng)用程序中的其他用戶。加密的 cookie 是 Laravel 中的重要安全特性。
所有這些加密和解密操作均由Laravel通過(guò) Encrypter
使用 PHP 內(nèi)置的安全工具處理,包括 OpenSSL。
在 Laravel 社區(qū)中,包括我自己直到最近,一個(gè)非常普遍的誤解是任務(wù) APP_KEY
用于登錄密碼的加密。幸運(yùn)的是,事實(shí)并非如此!我覺(jué)得這導(dǎo)致許多人認(rèn)為 APP_KEY
是不可更改,除非重置所有用戶的登錄。
密碼并非被加密,而是被 哈希散列.
Laravel 的密碼使用 Hash::make()
或 bcrypt()
進(jìn)行哈希處理,但都不使用 APP_KEY
。讓我們看一下 Laravel 中的加密和哈希。
Laravel 中有兩個(gè)主要的 facades:Crypt
(對(duì)稱加密) 和 Hash
(單向哈希加密)。密碼被 哈希散列,而 cookies 被(可選) 加密。讓我們看一下差異。
假設(shè)我想向我的朋友亞瑟 (Arthur) 發(fā)送一個(gè)秘密消息。上一次我們?cè)谝黄饡r(shí),我們倆一致確定了一個(gè)秘鑰:
$key = "dont-panic";
我想給他發(fā)一條短消息,只有該密鑰才能解密。我將使用我最喜歡的行業(yè)標(biāo)準(zhǔn)的開源加密函數(shù) openssl_encrypt()
(Laravel的 Crypt
使用的就是這個(gè))再加上我倆共同的 $key
進(jìn)行文本加密的字符串發(fā)送給他:
$message = "So long and thanks for all the fish";
$key = "dont-panic";
$cipher = "AES-256-CBC";
echo openssl_encrypt($message, $cipher, $key);
// JJEK8L4G3BCfY0evXDRxUke2zqAzq6i7wL/Px4SjaEHXqt3x7hsj4+PhVQaH4ujX
我可以用任何方式將這個(gè)字符串發(fā)送給亞瑟;由于我們是僅有的兩個(gè)擁有私鑰的人,因此我不擔(dān)心其他人會(huì)閱讀該消息。
當(dāng) Arthur 收到時(shí),他將使用我們的私鑰解密此過(guò)程。這是其中的 對(duì)稱 部分:我們能夠加密和解密而不會(huì)丟失信息。
$secret = "JJEK8L4G3BCfY0evXDRxUke2zqAzq6i7wL/Px4SjaEHXqt3x7hsj4+PhVQaH4ujX";
$key = "dont-panic";
$cipher = "AES-256-CBC";
echo openssl_decrypt($secret, $cipher, $key);
// So long and thanks for all the fish
Laravel 使用 APP_KEY
作為加密密鑰,對(duì)發(fā)送者和接收者的 cookie 使用相同的方法。使用相同的應(yīng)用程序密鑰對(duì)響應(yīng) cookie 進(jìn)行加密,發(fā)送給用戶,在接下來(lái)的請(qǐng)求中進(jìn)行讀取和解密。
我們的對(duì)稱加密示例具有很多潛在的用途,但是所有這些都涉及最終需要解密被加密的消息。
但是,當(dāng)涉及到諸如用戶密碼之類的東西時(shí),您永遠(yuǎn)都不應(yīng)有解密它們的方法。
這意味著我們的 Crypt
方法將無(wú)法使用,因此無(wú)法基于我們擁有的密鑰。相反,我們需要一個(gè) hashing 函數(shù),它應(yīng)該是:
快速: 計(jì)算機(jī)應(yīng)該能夠快速生成哈希
確定性: 散列相同的輸入總是給出相同的輸出
隨機(jī)性: 更改輸入的單個(gè)字母應(yīng)會(huì)徹底更改輸出
唯一: 沖突率(將不同的輸入散列到相同的輸出)應(yīng)該很小
難以暴力破解: 應(yīng)該很難對(duì)所有可能的輸入進(jìn)行散列以猜測(cè)我們的原始輸入
您可能已經(jīng)熟悉許多單向哈希算法:MD5 和 SHA-1 可以快速計(jì)算,但不是最安全的(它們?cè)谏鲜龅?4 和第 5 項(xiàng)上較弱)。
Laravel 散列實(shí)現(xiàn)了原生 PHP 的 password_hash()
函數(shù),默認(rèn)為一種稱為 bcrypt 的散列算法。對(duì)于單向哈希來(lái)說(shuō),這是一個(gè)很好的默認(rèn)值,您不需要更改它(盡管 Laravel 現(xiàn)在也提供了 一些其他 哈希方法。)
use Illuminate\Support\Facades\Hash;
$password = "dont-panic";
echo Hash::make($password);
// $2y$10$hEEF0lv4spxnvw5O4XyLZ.QjCE1tCu8HjMpWhmCS89J0EcSW0XELu
如果您曾經(jīng)查看過(guò) users
表,則可能看起來(lái)很熟悉。這是什么意思:
$2y$
使用 blowfish 算法進(jìn)行哈希散列 (bcrypt)
10$
“成本”因素(越高意味著要花更長(zhǎng)的時(shí)間進(jìn)行哈希)
hEEF0lv4spxnvw5O4XyLZ.
22位字符的 “salt”
QjCE1tCu8HjMpWhmCS89J0EcSW0XELu
哈希輸出
由于這是單向哈希,因此我們 無(wú)法 對(duì)其進(jìn)行解密。我們所能做的就是對(duì)它進(jìn)行測(cè)試。
當(dāng)使用此密碼的用戶嘗試登錄時(shí),Laravel 會(huì)對(duì)其密碼輸入進(jìn)行哈希處理,并使用 PHP 的 password_verify()
函數(shù)將新哈希與數(shù)據(jù)庫(kù)哈希進(jìn)行比較:
use Illuminate\Support\Facades\Hash;
$input = request()->get('password'); // "dont-panic"
$hash = '$2y$10$hEEF0lv4spxnvw5O4XyLZ.QjCE1tCu8HjMpWhmCS89J0EcSW0XELu';
return Hash::check($input, $hash);
// 正確
您會(huì)注意到,只有在需要對(duì)稱(可逆)加密時(shí),Laravel 才需要一個(gè)密鑰 (APP_KEY
)。用戶密碼的存儲(chǔ)永遠(yuǎn)不可逆,因此完全不需要 APP_KEY
。
但這并不意味著您的密鑰應(yīng)該被粗心對(duì)待。相反,請(qǐng)像對(duì)待其他任何生產(chǎn)憑證一樣對(duì)待它:使用與 MySQL 密碼或 MailChimp API 密鑰相同的注意和安全性。
任何良好的憑證管理策略都應(yīng)包括 輪換: 定期(例如每6個(gè)月)或在特定情況下(例如員工離職)更改密鑰和密碼。
幸運(yùn)的是,您只需要記住一些事情,就可以輪換你的 APP_KEY
。
如果您從多臺(tái)服務(wù)器提供相同的應(yīng)用程序,則需要更新每臺(tái)服務(wù)器上的密鑰。
更改 APP_KEY
后,當(dāng)前登錄到您的應(yīng)用程序的所有用戶的會(huì)話均將失效。在最佳時(shí)間安排您的密鑰輪換,以最大程度地減少給用戶帶來(lái)的不便。
盡管 cookie 的安全性是 Laravel 唯一使用 APP_KEY
作為框架的地方,但是您的應(yīng)用程序中可能會(huì)包含用于加密數(shù)據(jù)的自定義代碼。如果您使用 Laravel 的加密功能,請(qǐng)制定并測(cè)試一個(gè)計(jì)劃,以使用舊密鑰解密該數(shù)據(jù),然后使用新密鑰重新加密。
APP_KEY
首先,將現(xiàn)有的 APP_KEY
復(fù)制到其他地方,以防萬(wàn)一更改密鑰會(huì)產(chǎn)生意外的副作用。
在嘗試在生產(chǎn)服務(wù)器上輪換 APP_KEY 之前,請(qǐng)嘗試在本地計(jì)算機(jī)上輪換 APP_KEY,以確保一切順利。準(zhǔn)備好后,運(yùn)行 php artisan key:generate
:
[jbathman my_app]# php artisan key:generate
**************************************
* Application In Production! *
**************************************
Do you really wish to run this command? (yes/no) [no]:
> yes
Application key [base64:x2SHH01+2R+vwv09YcrvXqdFJ+bbqgT9gW4njcYLjDE=] set successfully.
就是這樣!如果要生成密鑰而不修改您的 .env
文件,請(qǐng)包含 --show
標(biāo)志:
[jbathman ~/my_app]# php artisan key:generate --show
base64:c3SzeMQZZHPT+eLQH6BnpDhw/uKH2N5zgM2x2a8qpcA=
到此,關(guān)于“Laravel中App_KEY的作用是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。