Cryptage et décryptage
- IntroductionLe mécanisme de cryptage de Laravel utilise le cryptage AES-256 et AES-128 fourni par OpenSSL. Il est fortement recommandé d'utiliser les outils de chiffrement intégrés de Laravel plutôt que d'autres algorithmes de chiffrement. Tous les résultats chiffrés de Laravel sont signés à l'aide d'un code d'authentification de message (MAC) afin que la valeur sous-jacente ne puisse pas être modifiée après le chiffrement.
Crypter une valeur
Vous pouvez utiliser la fonction d'assistance Encrypt pour chiffrer une valeur. Toutes les valeurs cryptées sont cryptées à l'aide de l'AES-256-CBC d'OpenSSL. De plus, toutes les valeurs cryptées sont signées à l'aide d'un code d'authentification de message (MAC) pour détecter si la chaîne cryptée a été falsifiée : config/app.php
配置文件中的 key
选项。你应当使用 php artisan key:generate
命令来生成密钥,这条 Artisan 命令会使用 PHP 的安全随机字节生成器来构建密钥。如果这个 key
<?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(); } }
Pas de cryptage de sérialisation
Pendant le processus de cryptage, la valeur cryptée serialize
est sérialisée et transmise, permettant le cryptage des objets et des tableaux. Par conséquent, les clients non PHP recevant des valeurs chiffrées doivent unsérialize
désérialiser les données. Si vous souhaitez crypter et déchiffrer des valeurs sans sérialisation, vous pouvez utiliser les méthodes encryptString
et decryptString
de Crypt
Facade : serialize
序列化后传递,允许加密对象和数组。因此,接收加密值的非 PHP 客户端需要对数据进行 unserialize
反序列化。如果想要在不序列化的情况下加密解密值,你可以使用 Crypt
Facade 的 encryptString
和 decryptString
方法:
use Illuminate\Support\Facades\Crypt; $encrypted = Crypt::encryptString('Hello world.'); $decrypted = Crypt::decryptString($encrypted);
解密一个值
你可以使用辅助函数 decrypt
来进行解密。如果该值不能被正确解密,例如 MAC 无效时,会抛出异常 IlluminateContractsEncryptionDecryptException
use Illuminate\Contracts\Encryption\DecryptException;try { $decrypted = decrypt($encryptedValue); } catch (DecryptException $e) { // }