T-DOC
  • Laravel-11
  • Laravel-10
  • Laravel-6X
  • Laravel-5.5
Dcat-Admin
  • Yii2
  • 重构2
  • Laravel-11
  • Laravel-10
  • Laravel-6X
  • Laravel-5.5
Dcat-Admin
  • Yii2
  • 重构2
  • 前言

    • 发行说明
    • 升级说明
    • 贡献导引
  • 入门指南

    • 安装
    • 配置信息
    • 文件夹结构
    • Homestead
    • Valet
    • 部署
  • 核心架构

    • 请求周期
    • 服务容器
    • 服务提供者
    • Facades
    • 契约
  • 基础功能

    • 路由
    • 中间件
    • CSRF 保护
    • 控制器
    • 请求
    • 响应
    • 视图
    • 生成 URL
    • Session
    • 表单验证
    • 错误
    • 日志
  • 前端开发

    • Blade 模板
    • 本地化
    • 前端指南
    • 编辑资源 Mix
  • 安全相关

    • 用户认证
    • API 认证
    • 用户授权
    • Email 认证
    • 加密解密
    • 哈希
    • 重置密码
  • 综合话题

    • Artisan 命令行
    • 广播系统
    • 缓存系统
    • 集合
    • 事件系统
    • 文件存储
    • 辅助函数
    • 邮件发送
    • 消息通知
    • 扩展包开发
    • 队列
    • 任务调度
  • 数据库

    • 快速入门
    • 查询构造器
    • 分页
    • 数据库迁移
    • 数据填充
    • Redis
  • Eloquent ORM

    • 快速入门
    • 模型关联
    • Eloquent 集合
    • 修改器
    • API 资源
    • 序列化
  • 测试相关

    • 快速入门
    • HTTP 测试
    • 命令行测试
    • 数据库测试
    • 测试模拟器 Mocking
  • 官方扩展包

    • Cashier 交易工具包
    • Dusk 浏览器测试
    • Envoy 部署工具
    • Horizon 队列管理工具
    • Passport OAuth 认证
    • Scout 全文搜索
    • Socialite 社会化登录
    • Telescope 调试工具

加密解密

Laravel 6 中文文档 /

本文档最新版为 10.x,旧版本可能放弃维护,推荐阅读最新版!

加密解密机制

  • 简介
  • 设置
  • 基本用法

简介

Laravel 的加密机制使用的是 OpenSSL 所提供的 AES-256 和 AES-128 加密。强烈建议你使用 Laravel 内建的加密工具,而不是用其它的加密算法。所有 Laravel 加密之后的结果都会使用消息认证码 (MAC) 签名,使其底层值不能在加密后再次修改。

设置

在使用 Laravel 的加密工具之前,你必须先设置 config/app.php 配置文件中的 key 选项。你应当使用 php artisan key:generate 命令来生成密钥,这条 Artisan 命令会使用 PHP 的安全随机字节生成器来构建密钥。如果这个 key 值没有被正确设置,则所有由 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 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 的 encryptString 和 decryptString 方法:

use Illuminate\Support\Facades\Crypt;

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

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

解密一个值

你可以使用辅助函数 decrypt 来进行解密。如果该值不能被正确解密,例如 MAC 无效时,会抛出异常 Illuminate\Contracts\Encryption\DecryptException :

use Illuminate\Contracts\Encryption\DecryptException;

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

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。


原文地址:https://learnku.com/docs/laravel/6.x/enc...

译文地址:https://learnku.com/docs/laravel/6.x/enc...

Last Updated:
Contributors: Hans
Prev
Email 认证
Next
哈希