”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 超越 AES — 使用 XChaCha20 对 Laravel 进行现代加密

超越 AES — 使用 XChaCha20 对 Laravel 进行现代加密

发布于2024-11-08
浏览:797

Beyond AES — Modern Encryption for Laravel with XChaCha20

在当今的数字环境中,数据加密是每个 Web 应用程序的重要组成部分。本文探讨了我为什么开发一个利用 Libsodium 的 XChaCha20-Poly1305 加密功能的包,以及它如何增强 Laravel 应用程序的安全性,同时最大限度地减少开销。

动机和要求

Laravel 的框架 Crypt Facade 为敏感数据的加密和解密提供了方便的接口,例如无状态身份验证令牌或服务间通信框架。

默认框架的加密实现基于通过 OpenSSL 的 AES-256-CBC,通常是安全的坚实基础,但总有改进的空间,特别是在性能和​​可用性至关重要的情况下。

现代算法和密码

虽然通过 OpenSSL 的 AES-256-CBC 仍然被认为是安全的,但已经过时了。此外,它对 OpenSSL 的依赖可能会引入潜在的漏洞,具体取决于特定版本和配置。

从 PHP 7.2 开始,Sodium 扩展与 PHP Core 捆绑在一起。 Libsodium 优先考虑现代、经过严格审查的加密原语,例如 XChaCha20-Poly1305 和 Ed25519。虽然 AES 通过硬件加速可以很快,但 XChaCha20-Poly1305 作为软件实现,在没有特殊硬件指令的情况下优于它。

// Default AES-256-CBC Encrypter
$encrypter = new Illuminate\Encryption\Encrypter($key, 'aes-256-cbc');

$start = microtime(true);
$results = [];

for ($i = 0; $i encrypt(['user_id' => $i]);
}

$elapsed = microtime(true) - $start;
// 4.08 seconds
// Custom XChaCha20-Poly1305 Encrypter
$encrypter = new Blu3blaze\Encrypter\Encrypter($key);

$start = microtime(true);
$results = [];

for ($i = 0; $i encrypt(['user_id' => $i]);
}

$elapsed = microtime(true) - $start;
// 1.79 seconds

令牌长度的显着优化

内置加密将密文、初始化向量和标签值编码为 JSON 对象的 Base64 表示形式,这显着增加了令牌的长度。
切换到XChaCha20算法无需编码JSON,nonce可以作为二进制字符串添加到密文中。

// Default AES-256-CBC Encrypter
$encrypter = new Illuminate\Encryption\Encrypter($key, 'aes-256-cbc');

$token = $encrypter->encrypt([
   'user_id' => '10296ab5-88b8-4dff-b7cf-2840b879e6dc'
]);
// 312 characters
// Custom XChaCha20-Poly1305 Encrypter
$encrypter = new Blu3blaze\Encrypter\Encrypter($key);

$token = $encrypter->encrypt([
   'user_id' => '10296ab5-88b8-4dff-b7cf-2840b879e6dc'
]);
// 139 characters

URL 中的 Base64 问题

嵌入式库使用原始的 Base64 变体。因此,使用令牌作为 URL 的一部分或作为 GET 参数之一需要从 Base64 到 Base64URLSafe 的额外转换。
立即在 Base64URLSafe 中对密文进行编码没有任何缺点,并且允许在任何环境中进行安全的令牌传输。

入门

1) 通过composer安装包

composer require blu3blaze/laravel-xchacha20-encrypter

2) 修改bootstrap/providers.php中的服务提供商列表

3) 使用 XChaCha20-Poly1305 算法享受 Crypt 外观

use Illuminate\Support\Facades\Crypt;

$token = Crypt::encrypt([
  'user_id' => '73d430f0-d39e-4642-a37e-9ef791b90d11'
]);

/* TAl1Sz4DTspE8ZzTOC6Q.....Ug5t4XcWqoiB6CWRak9Y */

$tokenData = Crypt::decrypt($token);

/* ['user_id' => '73d430f0-d39e-4642-a37e-9ef791b90d11'] */

结论

通过采用 blu3code/laravel-xchacha20-encrypter 包,您可以利用现代加密算法的优势,并在 Laravel 应用程序中实现显着的性能改进。这意味着更快的响应时间、更少的服务器负载以及更安全的用户数据环境。尝试一下,亲自看看有何不同!

版本声明 本文转载于:https://dev.to/blu3blaze/beyond-aes-modern-encryption-for-laravel-with-xchacha20-2d4g?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • React 模块 => 无框架
    React 模块 => 无框架
    我在 React 和游戏挑战方面的经验让我陷入了困境:如果我选择 jsDoc 来消除代码中的语言依赖 (TS)。下一步是将 CDN Tailwind 插入到该项目中。第三个是我开始开发游戏的时间有点晚,甚至我的模块(jsdoc-duck)也按预期工作,并加快了我的开发过程。但同时我不必对游戏交互进行...
    编程 发布于2024-11-09
  • 将 UNIX 时间戳转换为日期时,为什么 SimpleDateFormat.parse 的输出与指定的不同?
    将 UNIX 时间戳转换为日期时,为什么 SimpleDateFormat.parse 的输出与指定的不同?
    SimpleDateFormatter.parse 输出与指定不同使用 SimpleDateFormat 将 UNIX 时间戳转换为日期时,您可能会遇到指定格式与实际格式之间的差异输出。在给定的示例中,目标是将 UNIX 时间戳(“a1527069600”)转换为“dd/MM/yyyy hh:mm:...
    编程 发布于2024-11-09
  • 如何使用 JavaScript 在 Android 浏览器中可靠地检测设备旋转?
    如何使用 JavaScript 在 Android 浏览器中可靠地检测设备旋转?
    使用 JavaScript 检测 Android 浏览器中的设备旋转检测旋转的兼容性挑战使用 JavaScript 检测设备旋转与具有明确定义方法的 iPhone 相比,Android 手机上的浏览器可能更具挑战性。 Android 设备上的行为可能不一致,事件的顺序和频率以及 screen.wid...
    编程 发布于2024-11-09
  • 如何简化 Go 中的结构验证:惯用方法与“go-validator”?
    如何简化 Go 中的结构验证:惯用方法与“go-validator”?
    在 Go 中验证结构体验证结构体值的有效性是软件开发中的一项关键任务。当处理大量小结构时,单独检查每个字段可能很麻烦。让我们探讨一下验证结构的惯用方法和替代解决方案。惯用验证提供的示例是验证结构的常见方法。使用结构体的方法单独检查每个字段。然而,随着字段或结构体数量的增加,这种方法变得乏味。替代解决...
    编程 发布于2024-11-09
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-09
  • 如何使用 PHP 获取 MySQL 中父节点的所有子节点和后代节点?
    如何使用 PHP 获取 MySQL 中父节点的所有子节点和后代节点?
    使用 PHP 结合 MySQL 查询结果获取父级下的所有子节点、孙子节点等本文将引导您完成一种检索所有子节点和后代节点的方法使用 PHP 和 MySQL 查询结果的指定父级。这种技术消除了构建树结构的多维数组的需要,使您能够直接获取所有节点。考虑一个以邻接列表形式组织的 MySQL 表,其中层次结构...
    编程 发布于2024-11-09
  • 如何解决 Ajax XMLHttpRequest 文件上传中的“未找到多部分边界”错误?
    如何解决 Ajax XMLHttpRequest 文件上传中的“未找到多部分边界”错误?
    使用 Ajax XMLHttpRequest 上传文件:解决“未找到多部分边界”错误尝试使用 XMLHttpRequest 上传文件时,您可以遇到类似“请求被拒绝,因为未找到多部分边界”的错误。当文件未作为 multipart/form-data 请求正确发送时,就会出现此问题。一个常见错误是将文件...
    编程 发布于2024-11-09
  • HTML/CSS 课程 - 课程或年级
    HTML/CSS 课程 - 课程或年级
    HTML/CSS 课程 - 第 1 课细分 第 1 课:基本 HTML 回顾和高级 HTML 元素简介 客观的: 刷新基础 HTML 标签。 引入中级HTML元素来构建更多功能的网页。 1。 HTML结构简介 首先简要说明 HTML 如何使用标签组织网页内容。强...
    编程 发布于2024-11-09
  • 如何在 Go 中使用自定义 UnmarshalJSON 处理嵌入式结构?
    如何在 Go 中使用自定义 UnmarshalJSON 处理嵌入式结构?
    错误处理:嵌入式结构的自定义解组在 Go 中,当将 JSON 数据解组到具有嵌入式字段的结构时,如果嵌入式结构定义了其自己的 UnmarshalJSON 方法。这是因为 JSON 库调用嵌入结构的 UnmarshalJSON 并忽略包含结构中定义的字段。案例研究考虑以下结构定义:type Outer...
    编程 发布于2024-11-09
  • 带有虚拟主机的 PHP Apache 项目
    带有虚拟主机的 PHP Apache 项目
    创建项目目录 首先,为您的项目创建一个目录。例如,让我们创建一个名为 php: 的目录 sudo mkdir /var/www/html/php 创建 PHP 测试文件 在项目目录中创建一个index.php文件: echo "<?php phpinfo();...
    编程 发布于2024-11-09
  • 如何在 JavaScript 中基于唯一属性合并对象数组?
    如何在 JavaScript 中基于唯一属性合并对象数组?
    在 JavaScript 中基于唯一项组合数组合并数组可能是 JavaScript 中的一项常见任务,特别是当需要基于以下项组合数据时具体标准。在此特定实例中,目标是组合基于共享 lineNumber 属性的对象数组,从而生成具有 lineNumber 的对象数组和相应 cellWidth 值的数组...
    编程 发布于2024-11-09
  • 如何在共享托管平台上安装 Composer?
    如何在共享托管平台上安装 Composer?
    在共享托管平台上访问 Composer在共享托管环境上安装 Composer 面临着独特的挑战,但只要采取正确的方法,这是可能的。让我们探索一种行之有效的方法,在共享主机上获取 Composer,为您提供必要的可访问性。首先,在您的系统上找到下载的composer.phar 文件。找到后,继续执行以...
    编程 发布于2024-11-09
  • 了解 DOM 事件
    了解 DOM 事件
    DOM 事件使网页具有交互性。使用 DOM 事件可以实现页面点击或表单提交,它可以让开发人员创建引人入胜的用户体验。 DOM 事件的一些示例包括用户单击鼠标时、加载网页时、加载图像时、提交 HTML 表单时以及用户按下某个键时。 在本文中,我们将简化 DOM 事件中的关键概念并探讨如何处理它们。 ...
    编程 发布于2024-11-08
  • 为什么 PHP 中的“+”运算符不连接数组?
    为什么 PHP 中的“+”运算符不连接数组?
    理解 PHP 中的数组串联尝试使用 ' ' 运算符组合两个数组时,用户可能会遇到意外结果。这就是为什么以下代码没有按预期连接数组的原因:$array = array('Item 1'); $array = array('Item 2'); var_dump($array);此代码将...
    编程 发布于2024-11-08
  • 为什么 IE 日期构造函数与 Chrome 和 Firefox 日期处理不同?
    为什么 IE 日期构造函数与 Chrome 和 Firefox 日期处理不同?
    IE 日期构造函数问题:NaN 与其他浏览器中的功能在涉及 JavaScript 日历开发的项目中,日期处理中出现了差异Internet Explorer (IE) 以及 Firefox 和 Chrome 等浏览器。具体来说,IE 的日期函数产生 NaN(非数字)值,而它们在其他浏览器中正常运行。经...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3