Rumah >rangka kerja php >Laravel >Mari kita bincangkan tentang peranan App_KEY dalam Laravel
Apakah kegunaan App_KEY dalam Laravel? Artikel berikut akan memperkenalkan kepada anda peranan App_KEY saya harap ia akan membantu anda!
Menjana kunci aplikasi atau APP_KEY
ialah salah satu langkah awal yang paling penting setiap kali pembangun Laravel mencipta atau mengklonkan aplikasi Laravel.
Kemas kini keselamatan Laravel baru-baru ini telah membetulkan APP_KEY
kerentanan berkaitan tujuan. Untuk mengeksploitasi kelemahan ini, anda perlu mempunyai akses kepada versi pengeluaran APP_KEY
dahulu. Cara paling mudah untuk mengatasi kerentanan ini ialah menukar (menukar) APP_KEY
anda. Ini telah menyebabkan sesetengah daripada kita bertanya soalan: Apakah yang dilakukan oleh kunci aplikasi? Apakah yang melibatkan perubahan? Apakah amalan terbaik untuk mengurus kunci ini dalam aplikasi Laravel?
Dalam siaran ini, kita akan membincangkan perkara yang boleh dan tidak boleh dilakukan APP_KEY
, beberapa salah tanggapan biasa tentang cara ia berkaitan dengan cincang kata laluan pengguna dan langkah mudah untuk menukar APP_KEY
dengan selamat tanpa Tidak rugi akses kepada data anda.
Pada awal Ogos, Laravel 5.5 dan 5.6 menerima pembetulan keselamatan yang berkaitan dengan pensirilan dan penyulitan kuki. Di satu pihak, pembaikan adalah mudah dan kebanyakan aplikasi mungkin tidak terjejas. Sebaliknya, ini merupakan risiko keselamatan yang serius dan menunjukkan keperluan untuk komuniti kami memahami dengan lebih baik cara APP_KEY
berfungsi.
Untuk mengeksploitasi lubang keselamatan ini, seseorang perlu mengetahui APP_KEY
anda, itulah sebabnya saya akan membimbing anda melalui butiran kunci anda, sebab ia penting dan cara menukarnya.
Untuk mendapatkan maklumat tentang patch keselamatan, sila lihat sumber berikut:
APP_KEY
?
Kunci aplikasi ialah rentetan rawak 32-bit yang disimpan dalam kekunci .env
dalam fail APP_KEY
. Pemasang Laravel secara automatik menjana satu untuk anda, jadi anda hanya akan melihat ketiadaannya apabila mengklonkan aplikasi siap sedia.
Anda mungkin pernah melihat ralat ini sebelum ini:
Untuk mencipta kunci baharu, anda boleh menjana satu kunci sendiri dan menampalnya ke dalam .env
anda, atau anda boleh menjalankan php artisan key:generate
untuk membuat Laravel dan memasukkan kunci secara automatik untuk anda.
Setelah aplikasi berjalan, ia menggunakan APP_KEY
di satu tempat: kuki. Laravel menggunakan kunci untuk semua kuki yang disulitkan (termasuk kuki sesi) sebelum memberikannya kepada penyemak imbas pengguna, dan menggunakannya untuk menyahsulit kuki yang dibaca daripada penyemak imbas. Ini menghalang pelanggan daripada menukar kuki mereka dan memberi mereka keistimewaan pentadbir atau menyamar sebagai pengguna lain dalam aplikasi. Kuki yang disulitkan ialah ciri keselamatan yang penting dalam Laravel.
Semua operasi penyulitan dan penyahsulitan ini dikendalikan oleh Laravel melalui Encrypter
menggunakan alat keselamatan terbina dalam PHP, termasuk OpenSSL. Kami tidak akan melihat dengan lebih dekat cara penyulitan berfungsi di sini, tetapi jika anda ingin mengetahui lebih lanjut, saya menggalakkan anda membaca lebih lanjut tentang pelaksanaan PHP OpenSSL dan
openssl_encrypt
fungsi.
Di sekitar komuniti Laravel, termasuk saya sehingga baru-baru ini, salah tanggapan yang sangat biasa ialah tugas APP_KEY
telah digunakan untuk penyulitan kata laluan log masuk. Nasib baik, ini tidak berlaku! Saya rasa ini menyebabkan ramai orang percaya bahawa APP_KEY
tidak boleh diubah melainkan semua log masuk pengguna ditetapkan semula.
Kata laluan tidak disulitkan, tetapi cincang.
Kata laluan Laravel dicincang menggunakan Hash::make()
atau bcrypt()
Harapan pemprosesan, tetapi jangan lakukan gunakan APP_KEY
. Mari kita lihat penyulitan dan pencincangan dalam Laravel.
Terdapat dua fasad utama dalam Laravel: Crypt
(penyulitan simetri) dan Hash
(penyulitan tunggal) penyulitan kepada cincang). Kata laluan adalah cincang dan kuki (secara pilihan) disulitkan. Mari kita lihat perbezaannya.
假设我想向我的朋友亚瑟 (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视频教程】
Atas ialah kandungan terperinci Mari kita bincangkan tentang peranan App_KEY dalam Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!