Laravel 文档阅读:加密

翻译、衍生自:https://learnku.com/docs/laravel/5.5/encryption

简介

Laravel 加密器使用 OpenSSL 来提供 AES-256 和 AES-128 加密。强烈建议你使用 Laravel 内置的加密工具,而不是用你的「本土化」加密算法。Laravel 中的所有加密值都使用了消息认证码(MAC)签名,因此能保证底层值经过加密后不能被修改。

配置

在使用 Laravel 加密器之前,你必须先要配置 config/app.php 文件中的 key 选项。可以用 php artisan key:generate 命令生成这个 密钥,因为命令底层是使用了 PHP 的安全随机字节生成器来生成密钥的。如果这个密钥没有正确配置,Laravel 中的所有加密值都是不安全的。

使用加密器

加密一个值

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

<?php

namespace App\Http\Controllers;

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

class UsersController extends Controller
{
    /**
     * Store a secret message for the user.
     *
     * @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();
    }
}

无序列化加密

encrypt 加密方法在加密过程中会对加密值序列化,所以我们可以为该方法传递对象和数组。但是,对于非 PHP 客户端来说,是无法处理这个加密值的,对这类客户端,我们需要取消对数据的序列化步骤。无序列化的加密和解密一个值,需要使用 Crypt 门面的 encryptStringdecryptString 方法:

use Illuminate\Support\Facades\Crypt;

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

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

解密一个值

使用 decrypt 方法来解密经 encrypt 方法加密的值。如果传递给 decrypt 方法的加密值无法正确解密,例如 MAC 无效时,将会抛出一个 Illuminate\Contracts\Encryption\DecryptException 异常:

use Illuminate\Contracts\Encryption\DecryptException;

try {
    $decrypted = decrypt($encryptedValue);
} catch (DecryptException $e) {
    //
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 6年前 加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

这种可以在前端解密吗?

7个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!