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
    • Contracts
  • 基础功能

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

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

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

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

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

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

    • 快速入门
    • HTTP 测试
    • 浏览器测试 Dusk
    • 数据库测试
    • 测试模拟器
  • 官方扩展包

    • Cashier 交易工具包
    • Envoy 部署工具
    • Horizon
    • Scout 全文搜索
    • Socialite 社会化登录

加密解密

Laravel 5.5 中文文档 /

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

Laravel 的加密解密机制

  • 简介
  • 设置
  • 使用

简介

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

设置

在使用 Laravel 的加密程序之前, 你必须先设置 config/app.php 配置文件中的 key 选项。运行 Artisan命令 php artisan key:generate,它会使用 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) {
    //
}

译者署名

用户名头像职能签名
@GanymedeNil6859_1487055454.jpg翻译争做一个 Full Stack Developer @GanymedeNil
@JokerLinly5350_1481857380.jpgReviewStay Hungry. Stay Foolish.

{note} 欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。

转载请注明:本文档由 Laravel China 社区 laravel-china.org 组织翻译,详见 翻译召集帖。

文档永久地址: 《Laravel 中文文档》

Last Updated:
Contributors: Hans
Prev
用户授权
Next
哈希