Maison >cadre php >Laravel >Cryptage et décryptage des données dans Laravel

Cryptage et décryptage des données dans Laravel

Jennifer Aniston
Jennifer Anistonoriginal
2024-12-12 11:50:02231parcourir

Ce guide explique comment implémenter le cryptage et le déchiffrement des données sensibles dans les modèles Laravel. En effectuant les étapes suivantes, vous pouvez protéger les données avant de les stocker dans la base de données et les déchiffrer lors de la récupération des données.

Cryptage et décryptage des données dans Laravel

Prérequis

  • Laravel : Assurez-vous que vous utilisez un projet Laravel.
  • Clé de cryptage : Laravel génère automatiquement APP_KEY dans le fichier .env. Cette clé est utilisée par le service de chiffrement de Laravel.

Étape 1 : Configurer le cryptage dans le modèle

Dans le modèle, nous utiliserons les fonctions encrypt() et decrypt() de Laravel pour gérer automatiquement le cryptage et le déchiffrement des champs spécifiés.

Modèle Docteur

Créez ou mettez à jour un modèle Docteur à l'aide de méthodes de cryptage et de décryptage. Nous chiffrerons les champs tels que le prénom, le nom, l'e-mail et le téléphone portable avant de les enregistrer dans la base de données.

<?phpnamespace AppModels;use IlluminateDatabaseEloquentModel;use IlluminateSupportFacadesCrypt;class Doctor extends Model{
    protected $fillable = [
        &#39;first_name&#39;, &#39;last_name&#39;, &#39;email&#39;, &#39;mobile&#39;, &#39;hashed_email&#39;, &#39;password&#39;
    ];

    // Automatically encrypt attributes when setting them
    public function setFirstNameAttribute($value)
    {
        $this->attributes['first_name'] = encrypt($value);
    }

    public function setLastNameAttribute($value)
    {
        $this->attributes['last_name'] = encrypt($value);
    }

    public function setEmailAttribute($value)
    {
        $this->attributes['email'] = encrypt($value);
    }

    public function setMobileAttribute($value)
    {
        $this->attributes['mobile'] = encrypt($value);
    }

    // Automatically decrypt attributes when getting them
    public function getFirstNameAttribute($value)
    {
        return decrypt($value);
    }

    public function getLastNameAttribute($value)
    {
        return decrypt($value);
    }

    public function getEmailAttribute($value)
    {
        return decrypt($value);
    }

    public function getMobileAttribute($value)
    {
        return decrypt($value);
    }}

Description

  • Méthode Setter : utilisez set{AttributeName }Attribute() pour crypter les données avant de les stocker dans la base de données.
  • Méthode Getter : utilisez get{AttributeName}Attribute() pour déchiffrer lors de la récupération des données de la base de données.

Étape 2 : Contrôleur pour le stockage et la récupération des données

Dans le contrôleur, vous pouvez gérer la validation et appeler le modèle Chiffrer directement les attributs sans cryptage/déchiffrement supplémentaire étape.

DoctorController

DoctorController gère l'inscription via la validation Saisissez les données, cryptez-les via le modèle et enregistrez-les dans la base de données. Lorsque les données du médecin sont obtenues, elles seront automatiquement décryptées Domaines sensibles.

<?phpnamespace AppHttpControllers;use IlluminateHttpRequest;use AppModelsDoctor;use IlluminateSupportFacadesHash;class DoctorController extends Controller{
    public function register(Request $request)
    {
        // Validate the incoming request
        $validatedData = $request->validate([
            'first_name' => 'required|string|max:255',
            'last_name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:doctors,email',
            'mobile' => 'required|string|size:10|unique:doctors,mobile',
            'password' => 'required|string|min:8|confirmed',
        ]);

        // Hash the email to ensure uniqueness
        $hashedEmail = hash('sha256', $validatedData['email']);

        // Create a new doctor record (model will handle encryption)
        $doctor = Doctor::create([
            'first_name' => $validatedData['first_name'],
            'last_name' => $validatedData['last_name'],
            'email' => $validatedData['email'],
            'hashed_email' => $hashedEmail,
            'mobile' => $validatedData['mobile'],
            'password' => Hash::make($validatedData['password']),
        ]);

        return response()->json([
            'message' => 'Doctor registered successfully',
            'doctor' => $doctor
        ], 201);
    }

    public function show($id)
    {
        // Fetch the doctor record (model will decrypt the data automatically)
        $doctor = Doctor::findOrFail($id);

        return response()->json($doctor);
    }}

Description

  • Méthode d'enregistrement : vérifiez la demande entrante, créez un nouveau dossier médical et cryptez automatiquement les champs tels que le prénom, le nom, l'e-mail et le téléphone portable en fonction de la méthode de cryptage du modèle.
  • afficher la méthode : récupérer les dossiers médicaux par pièce d'identité. ce Les champs sensibles seront automatiquement déchiffrés avant la méthode getter du modèle Renvoie les données.

Étape 3 : Configuration de la base de données

Assurez-vous que les colonnes de la table Doctor pour les données sensibles sont suffisamment longues pour gérer les données cryptées (généralement TEXT ou LONGTEXT).

Exemple de paramètres de migration :

Schema::create('doctors', function (Blueprint $table) {
    $table->id();
    $table->text('first_name');
    $table->text('last_name');
    $table->text('email');
    $table->string('hashed_email')->unique(); // SHA-256 hashed email
    $table->text('mobile');
    $table->string('password');
    $table->timestamps();});

Remarque : étant donné que les valeurs chiffrées peuvent être beaucoup plus longues que le texte brut, le texte est préféré pour les champs chiffrés .

Étape 4 : Gérer les exceptions de décryptage

Pour améliorer la gestion des erreurs, enveloppez la logique de décryptage dans un bloc try-catch dans le getter de modèle :

<?phpnamespace AppModels;use IlluminateDatabaseEloquentModel;use IlluminateSupportFacadesCrypt;class Doctor extends Model{
    protected $fillable = [
        &#39;first_name&#39;, &#39;last_name&#39;, &#39;email&#39;, &#39;mobile&#39;, &#39;hashed_email&#39;, &#39;password&#39;
    ];

    // Automatically encrypt attributes when setting them
    public function setFirstNameAttribute($value)
    {
        $this->attributes['first_name'] = encrypt($value);
    }

    public function setLastNameAttribute($value)
    {
        $this->attributes['last_name'] = encrypt($value);
    }

    public function setEmailAttribute($value)
    {
        $this->attributes['email'] = encrypt($value);
    }

    public function setMobileAttribute($value)
    {
        $this->attributes['mobile'] = encrypt($value);
    }

    // Automatically decrypt attributes when getting them
    public function getFirstNameAttribute($value)
    {
        return decrypt($value);
    }

    public function getLastNameAttribute($value)
    {
        return decrypt($value);
    }

    public function getEmailAttribute($value)
    {
        return decrypt($value);
    }

    public function getMobileAttribute($value)
    {
        return decrypt($value);
    }}

Notes supplémentaires

  • Sécurité environnementale : assurez-vous que APP_KEY est stocké en toute sécurité dans le fichier .env. Cette clé est indispensable au chiffrement/déchiffrement.
  • Sauvegarde des données : si l'intégrité des données est critique, assurez-vous d'avoir mis en place un mécanisme de sauvegarde, car les données cryptées seront irrécupérables sans la bonne APP_KEY.

Résumé

  1. Cryptage du modèle : utilisez la méthode setter pour crypter les données avant le stockage et utilisez la méthode getter pour les déchiffrer lors de la récupération.
  2. Logique du contrôleur : le contrôleur peut gérer les champs cryptés directement sans code de cryptage supplémentaire.
  3. Configuration de la base de données : utilisez les colonnes TEXT ou LONGTEXT comme champs cryptés.
  4. Remarque de sécurité : sécurisez votre APP_KEY et utilisez la gestion des exceptions dans le getter pour gérer les erreurs de décryptage.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Cryptage et décryptage des données dans LaravelArticle suivant:Aucun