ホームページ  >  記事  >  PHPフレームワーク  >  LaravelにおけるApp_KEYの役割について話しましょう

LaravelにおけるApp_KEYの役割について話しましょう

青灯夜游
青灯夜游転載
2022-10-28 19:56:541983ブラウズ

Laravel での App_KEY の用途は何ですか? App_KEYの役割については以下の記事で紹介していますので、ご参考になれば幸いです。

LaravelにおけるApp_KEYの役割について話しましょう

Laravel 開発者が Laravel アプリケーションを作成または複製するたびに、アプリケーション キー または APP_KEY を生成することが最も重要な初期設定です。第一歩。

最新の Laravel セキュリティ アップデートは、APP_KEY の使用法関連の脆弱性を修正します。この脆弱性を悪用するには、まず製品バージョン APP_KEY にアクセスする必要があります。この脆弱性を解決する最も簡単な方法は、APP_KEY を変換 (変更) することです。このことから、「アプリケーション キーは何をするのでしょうか?」という疑問を持つ人もいます。変更には何が含まれますか? Laravelアプリケーションでこれらのキーを管理するためのベストプラクティスは何ですか?

この投稿では、APP_KEY の推奨事項、してはいけないこと、ユーザー パスワード ハッシュとの関連性に関するよくある誤解、および APP_KEY を安全に変更する方法について説明します。データへのアクセスを失うことなく。

Laravel セキュリティ修正

8 月初旬、Laravel 5.5 および 5.6 は Cookie のシリアル化と暗号化に関連するセキュリティ修正を受け取りました。一方で、修正は簡単で、ほとんどのアプリケーションはおそらく影響を受けません。一方で、これは重大なセキュリティ リスクであり、コミュニティが APP_KEY がどのように機能するかをより深く理解する必要があることを示しています。

このセキュリティ ホールを悪用するには、誰かがあなたの APP_KEY を知る必要があります。そのため、キーの詳細、それが重要な理由、および変更方法について説明します。それ。

セキュリティ修正の詳細については、次のリソースを参照してください:

APP_KEY とは何ですか?

アプリケーション キーは、.env ファイルの APP_KEY キーに保存されている 32 ビットのランダムな文字列です。 Laravel インストーラーは自動的にインストーラーを生成するため、既製のアプリケーションをクローンするときにのみインストーラーが存在しないことに気づきます。

このエラーを以前に見たことがあるかもしれません:

LaravelにおけるApp_KEYの役割について話しましょう

新しいキーを作成するには、自分でキーを生成し、それを .env に貼り付けます。 または、phpArtisan key:generate を実行して、Laravel にキーを作成して自動的に挿入させることもできます。

アプリケーションの実行後、APP_KEY が 1 か所 (Cookie) で使用されます。 Laravel は、ユーザーのブラウザに渡す前にすべての暗号化された Cookie (セッション Cookie を含む) のキーを使用し、ブラウザから読み取られた Cookie を復号化するために使用します。これにより、クライアントが Cookie を変更して管理者権限を付与したり、アプリケーション内で他のユーザーになりすますことができなくなります。暗号化された Cookie は、Laravel の重要なセキュリティ機能です。

これらすべての暗号化および復号化操作は、OpenSSL などの PHP の組み込みセキュリティ ツールを使用して、Encrypter を通じて Laravel によって処理されます。ここでは暗号化がどのように機能するかについては詳しく説明しませんが、さらに詳しく知りたい場合は、PHP による OpenSSL の実装と、 openssl_encrypt function.

パスワード ハッシュに関するよくある誤解

Laravel コミュニティでは、次のものが含まれます。私自身、最近までよくある誤解は、タスク APP_KEY がログイン パスワードの暗号化に使用されるということです。幸いなことに、そうではありません。このため、多くの人は、すべてのユーザーのログインがリセットされない限り、APP_KEY は変更できないと信じていると思います。

パスワードは暗号化されていませんが、ハッシュ化された.

Laravelパスワードの使用法Hash::make() または #ハッシュには ##bcrypt() を使用しますが、どちらも APP_KEY を使用しません。 Laravel の暗号化とハッシュを見てみましょう。

暗号化とハッシュLaravel には 2 つの主要なファサードがあります:

Crypt

(対称暗号化) と ハッシュ (一方向ハッシュ暗号化)。パスワードは ハッシュ化され、Cookie は (オプションで) 暗号化されます。違いを見てみましょう。

对称加密

假设我想向我的朋友亚瑟 (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视频教程

以上がLaravelにおけるApp_KEYの役割について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。