Laravel 中的 App_KEY 到底有什麼用?以下這篇文章跟大家介紹App_KEY 的作用,希望對大家有幫助!
每次Laravel 開發人員新建或複製Laravel 應用時,產生application key 或APP_KEY
是最重要的初始步驟之一。
最近的 Laravel 安全性更新修復了一個 APP_KEY
用途相關的漏洞。為了利用此漏洞,首先需要有權存取生產版 APP_KEY
。解決此漏洞最簡單的方法是轉換(更改)您的 APP_KEY
。這導致我們中的一些人提出了一個問題:應用程式密鑰有什麼作用?更改涉及什麼?管理 Laravel 應用程式中的這些金鑰的最佳實踐是什麼?
在這篇文章中,我們將討論APP_KEY
做和不做的事情,關於它與使用者密碼雜湊的關係的一些常見誤解,以及安全地更改 APP_KEY
的簡單步驟而不會遺失對您資料的存取權。
8月初,Laravel 5.5 和 5.6 收到了與 Cookie 序列化和加密相關的安全修復。一方面,修復很簡單,大多數應用程式可能沒有受到影響。另一方面,這是一個嚴重的安全風險,表明我們的社區需要更好地了解 APP_KEY
的工作方式。
要利用此安全漏洞,需要有人知道您的 APP_KEY
,這就是為什麼我要帶您詳細了解您的金鑰,為什麼重要以及如何更改它的原因。
有關安全修補程式的信息,請參閱以下資源:
APP_KEY
?
應用程式金鑰是一個32位元字元的隨機字串,儲存在 .env
檔案中的 APP_KEY
金鑰中。 Laravel 安裝程式會自動為您產生一個,因此您只會在複製現成應用程式時注意到它的缺失。
您之前可能看到過此錯誤:
要建立新金鑰,您可以自己產生一個金鑰並將其貼到您的.env
中,或可以執行php artisan key:generate
讓Laravel 為您建立並自動插入一個金鑰。
應用程式運行後,便會在一個地方使用 APP_KEY
:cookie。 Laravel 將金鑰用於所有加密的 cookie (包括會話 cookie),然後再交給使用者瀏覽器,並使用它來解密從瀏覽器讀取的 cookie。這樣可以防止客戶端更改其 cookie 並為其授予管理員特權或模擬應用程式中的其他使用者。加密的 cookie 是 Laravel 中重要的安全特性。
所有這些加密和解密操作均由Laravel透過 Encrypter
使用 PHP 內建的安全工具處理,包括 OpenSSL。我們不會在這裡仔細研究加密的工作原理,但是如果您想了解更多信息,我鼓勵您閱讀更多關於 PHP implementation of OpenSSL 和
openssl_encrypt
function.
在Laravel 社群中,包括我自己直到最近,一個非常普遍的誤解是任務APP_KEY
用於登入密碼的加密。幸運的是,事實並非如此!我覺得這導致許多人認為 APP_KEY
是不可更改,除非重置所有使用者的登入。
密碼並非被加密,而是被哈希雜湊.
#Laravel 的密碼使用Hash::make()
或bcrypt()
進行雜湊處理,但都不使用APP_KEY
。讓我們來看看 Laravel 中的加密和哈希。
Laravel 中有兩個主要的facades:Crypt
(對稱加密) 和Hash
(單向哈希加密)。密碼被 哈希雜湊,而 cookies 被(可選) 加密。讓我們來看看差異。
假设我想向我的朋友亚瑟 (Arthur) 发送一个秘密消息。上一次我们在一起时,我们俩一致确定了一个秘钥:
$key = "dont-panic";
我想给他发一条短消息,只有该密钥才能解密。我将使用我最喜欢的行业标准的开源加密函数 openssl_encrypt()
(Laravel的 Crypt
使用的就是这个)再加上我俩共同的 $key
进行文本加密的字符串发送给他:
$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
我可以用任何方式将这个字符串发送给亚瑟;由于我们是仅有的两个拥有私钥的人,因此我不担心其他人会阅读该消息。
当 Arthur 收到时,他将使用我们的私钥解密此过程。这是其中的 对称 部分:我们能够加密和解密而不会丢失信息。
$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
作为加密密钥,对发送者和接收者的 cookie 使用相同的方法。使用相同的应用程序密钥对响应 cookie 进行加密,发送给用户,在接下来的请求中进行读取和解密。
我们的对称加密示例具有很多潜在的用途,但是所有这些都涉及最终需要解密被加密的消息。
但是,当涉及到诸如用户密码之类的东西时,您永远都不应有解密它们的方法。
这意味着我们的 Crypt
方法将无法使用,因此无法基于我们拥有的密钥。相反,我们需要一个 hashing 函数,它应该是:
快速: 计算机应该能够快速生成哈希
确定性: 散列相同的输入总是给出相同的输出
随机性: 更改输入的单个字母应会彻底更改输出
唯一: 冲突率(将不同的输入散列到相同的输出)应该很小
难以暴力破解: 应该很难对所有可能的输入进行散列以猜测我们的原始输入
您可能已经熟悉许多单向哈希算法:MD5 和 SHA-1 可以快速计算,但不是最安全的(它们在上述第 4 和第 5 项上较弱)。
Laravel 散列实现了原生 PHP 的 password_hash()
函数,默认为一种称为 bcrypt 的散列算法。对于单向哈希来说,这是一个很好的默认值,您不需要更改它(尽管 Laravel 现在也提供了 一些其他 哈希方法。)
use Illuminate\Support\Facades\Hash; $password = "dont-panic"; echo Hash::make($password); // $2y$10$hEEF0lv4spxnvw5O4XyLZ.QjCE1tCu8HjMpWhmCS89J0EcSW0XELu
如果您曾经查看过 users
表,则可能看起来很熟悉。这是什么意思:
$2y$
使用 blowfish 算法进行哈希散列 (bcrypt)10$
“成本”因素(越高意味着要花更长的时间进行哈希)hEEF0lv4spxnvw5O4XyLZ.
22位字符的 “salt”QjCE1tCu8HjMpWhmCS89J0EcSW0XELu
哈希输出由于这是单向哈希,因此我们 无法 对其进行解密。我们所能做的就是对它进行测试。
当使用此密码的用户尝试登录时,Laravel 会对其密码输入进行哈希处理,并使用 PHP 的 password_verify()
函数将新哈希与数据库哈希进行比较:
use Illuminate\Support\Facades\Hash; $input = request()->get('password'); // "dont-panic" $hash = '$2y$10$hEEF0lv4spxnvw5O4XyLZ.QjCE1tCu8HjMpWhmCS89J0EcSW0XELu'; return Hash::check($input, $hash); // 正确
您会注意到,只有在需要对称(可逆)加密时,Laravel 才需要一个密钥 (APP_KEY
)。用户密码的存储永远不可逆,因此完全不需要 APP_KEY
。
但这并不意味着您的密钥应该被粗心对待。相反,请像对待其他任何生产凭证一样对待它:使用与 MySQL 密码或 MailChimp API 密钥相同的注意和安全性。
任何良好的凭证管理策略都应包括 轮换: 定期(例如每6个月)或在特定情况下(例如员工离职)更改密钥和密码。
幸运的是,您只需要记住一些事情,就可以轮换你的 APP_KEY
。
如果您从多台服务器提供相同的应用程序,则需要更新每台服务器上的密钥。
更改 APP_KEY
后,当前登录到您的应用程序的所有用户的会话均将失效。在最佳时间安排您的密钥轮换,以最大程度地减少给用户带来的不便。
尽管 cookie 的安全性是 Laravel 唯一使用 APP_KEY
作为框架的地方,但是您的应用程序中可能会包含用于加密数据的自定义代码。如果您使用 Laravel 的加密功能,请制定并测试一个计划,以使用旧密钥解密该数据,然后使用新密钥重新加密。
APP_KEY
首先,将现有的 APP_KEY
复制到其他地方,以防万一更改密钥会产生意外的副作用。
在尝试在生产服务器上轮换 APP_KEY 之前,请尝试在本地计算机上轮换 APP_KEY,以确保一切顺利。准备好后,运行 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
文件,请包含 --show
标志:
[jbathman ~/my_app]# php artisan key:generate --show base64:c3SzeMQZZHPT+eLQH6BnpDhw/uKH2N5zgM2x2a8qpcA=
APP_KEY
不会影响用户密码APP_KEY
,会导致 session (通过 cookie 实现)无效,所有当前用户被注销APP_KEY
APP_KEY
以及其他凭据和密钥如果您的代码已手动使用 Laravel 的加密器,则需要制定计划以使用旧密钥解密其加密数据,然后使用新密钥重新加密。
原文地址:https://tighten.co/blog/app-key-and-you
译文地址:https://learnku.com/laravel/t/41250
【相关推荐:laravel视频教程】
以上是聊聊 Laravel 中 App_KEY 的作用的詳細內容。更多資訊請關注PHP中文網其他相關文章!