tigr/laravel-compact-encrypter

为Laravel提供的加密器,输出更短

1.0.3 2023-05-31 16:15 UTC

This package is auto-updated.

Last update: 2024-08-30 01:28:52 UTC


README

Travis (.org) PHP from Packagist Laravel Version Packagist Version GitHub

这是一个Laravel加密器的直接替换品,它可以生成更简洁且URL安全的输出,并支持旧格式加密数据。适用于Laravel 5.5及以上版本。

安装

composer require tigr/laravel-compact-encrypter

然后Laravel应该会自动注册我们的服务提供者。

为什么?

当谈到空间使用效率时,Laravel的加密器非常低效。它将64字节的原始加密数据转换为192个字符。如何做到的?

Laravel以base64编码的JSON形式存储加密数据,其中包含base64和HEX字符串。所以是 base64_encode(json_encode(base64_encode(data) + sha256 hex hash))。只需比较简单字符串“hello”的加密即可。

# Laravel Encrypter: 192 characters long
$ artisan tinker
>>> Crypt::encryptString('hello')
=> "eyJpdiI6IlZRZFY5TVZiZVdNSlg3RVdDYTNDbHc9PSIsInZhbHVlIjoiNk9rXC9oV3hZaWEzNE95SU5xMUVHUWc9PSIsIm1hYyI6ImIyZDQ1MTdiODlhMzU1ZjQ1NmU3N2ZlN2I4OGU0Yzc2MjIyZDBkMzAwMGViNjM2OTFlMTZkOGY4MDFjYTg1NDIifQ=="

# add Compact Encrypter
$ composer require tigr/laravel-compact-encrypter

# Compact Encrypter: 70 characters long
$ artisan tinker
>>> Crypt::encryptString('hello')
=> "ABvcrldH1QNn8AgEL_LY-E_Cj04MRWPn3M-kSuvf3DAjzsNfFqC_lUml6iqGkRTjlox2kA"

# Compact Encrypter dropping verification hash: 53 characters long
>>> Crypt::encryptString('hello', false)
=> "z4zztewR8vQ7QId_P6diDRW2DvVPhwf4xh8gNss4G1o"

谁会在乎?

首先,如果你有加密的cookie,你可能会很容易遇到来自服务器或中间的负载均衡/DDoS保护代理的“header too long”的400错误。平均而言,Compact Encrypter生成的输出更紧凑,提高了25-275%,如果去掉哈希,甚至可以提高360%。

其次,你可能想在URL中使用自包含的令牌(无需令牌数据库),但你知道吗,192个字符,其中一些是URL转义过的,看起来非常丑陋。

它是如何工作的?

  1. 没有中间的base64或hex编码,所有数据都是原始二进制。
  2. 没有JSON,使用pack()/unpack()。
  3. 使用URL安全的base64版本(删除尾随'=',将'/+'替换为'-_')。
  4. 对于哈希,使用SHA1而不是SHA256。我知道,我知道,但对于实际应用目的,SHA1仍然足够好。
  5. 如果需要,允许丢弃Mac(验证哈希)。
  6. 并提供在遇到用Laravel Encryptor加密的数据时的回退解密。