Rumah >rangka kerja php >Laravel >Mari kita bincangkan tentang peranan App_KEY dalam Laravel

Mari kita bincangkan tentang peranan App_KEY dalam Laravel

青灯夜游
青灯夜游ke hadapan
2022-10-28 19:56:542180semak imbas

Apakah kegunaan App_KEY dalam Laravel? Artikel berikut akan memperkenalkan kepada anda peranan App_KEY saya harap ia akan membantu anda!

Mari kita bincangkan tentang peranan App_KEY dalam Laravel

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.

Pembetulan Keselamatan Laravel

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:

Apakah itu 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:

Mari kita bincangkan tentang peranan App_KEY dalam Laravel

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.

Salah tanggapan biasa tentang cincang kata laluan

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.

Penyulitan dan Pencincangan

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

我可以用任何方式将这个字符串发送给亚瑟;由于我们是仅有的两个拥有私钥的人,因此我不担心其他人会阅读该消息。

fake tweet with encrypted string

当 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

多台服务器

如果您从多台服务器提供相同的应用程序,则需要更新每台服务器上的密钥。

现有用户的 sessions (cookies)

更改 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!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam