Skip to content

加密

介绍

Laravel 的加密器使用 OpenSSL 提供 AES-256 和 AES-128 加密。强烈建议您使用 Laravel 内置的加密功能,而不是尝试自己编写“自制”的加密算法。所有 Laravel 的加密值都使用消息认证码 (MAC) 签名,以便在加密后无法修改其底层值。

配置

在使用 Laravel 的加密器之前,您必须在 config/app.php 配置文件中设置一个 key 选项。您应该使用 php artisan key:generate 命令生成此密钥,因为此 Artisan 命令将使用 PHP 的安全随机字节生成器来构建您的密钥。如果此值未正确设置,Laravel 加密的所有值将不安全。

使用加密器

加密一个值

您可以使用 encrypt 辅助函数加密一个值。所有加密的值都使用 OpenSSL 和 AES-256-CBC 密码进行加密。此外,所有加密的值都使用消息认证码 (MAC) 签名,以检测对加密字符串的任何修改:

php
<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * 为用户存储一个秘密消息。
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     */
    public function storeSecret(Request $request, $id)
    {
        $user = User::findOrFail($id);

        $user->fill([
            'secret' => encrypt($request->secret)
        ])->save();
    }
}

不使用序列化加密

加密的值在加密过程中通过 serialize,这允许加密对象和数组。因此,接收加密值的非 PHP 客户端需要 unserialize 数据。如果您希望在不使用序列化的情况下加密和解密值,可以使用 Crypt facade 的 encryptStringdecryptString 方法:

php
use Illuminate\Support\Facades\Crypt;

$encrypted = Crypt::encryptString('Hello world.');

$decrypted = Crypt::decryptString($encrypted);

解密一个值

您可以使用 decrypt 辅助函数解密值。如果无法正确解密该值,例如当 MAC 无效时,将抛出 Illuminate\Contracts\Encryption\DecryptException

php
use Illuminate\Contracts\Encryption\DecryptException;

try {
    $decrypted = decrypt($encryptedValue);
} catch (DecryptException $e) {
    //
}