Position actuelle: Accueil> Derniers articles> Comment importer des données de mot de passe crypt () utilisées dans les anciens systèmes dans des systèmes modernes et assurer la compatibilité?

Comment importer des données de mot de passe crypt () utilisées dans les anciens systèmes dans des systèmes modernes et assurer la compatibilité?

M66 2025-06-23

Dans de nombreux projets PHP qui sont utilisés depuis de nombreuses années ou même depuis plus d'une décennie, les mots de passe utilisateur sont souvent stockés chiffrés à l'aide de la fonction crypt () . Bien que cette approche ait été très courante dans le passé, elle a été remplacée par des algorithmes plus forts tels que mot de passe_hash () et mot de passe_verify () selon les normes de sécurité d'aujourd'hui. Cependant, lorsque la migration du système ou la mise à niveau, nous devons toujours être compatibles avec les anciennes données, surtout si nous ne pouvons pas forcer tous les utilisateurs à réinitialiser leurs mots de passe.

Cet article présentera comment migrer en douceur les anciennes données de mot de passe cryptées avec Crypt () vers le nouveau système, et s'assurer que le nouveau système est compatible avec l'ancienne vérification du mot de passe, et peut progressivement passer à une méthode de chiffrement plus sécurisée après que l'utilisateur se soit connecté.

1. Comprendre la logique de cryptage de crypte ()

La fonction Crypt () de PHP peut utiliser différents algorithmes de chiffrement, tels que le DES traditionnel, MD5, SHA-256, SHA-512, etc. La méthode de cryptage dépend du "sel" fourni:

  • Le cryptage (sel à deux caractères)

  • Encryption MD5 (sel en commençant par 1 $ )

  • Cryptage SHA-256 (sel commençant par 5 $ )

  • Cryptage SHA-512 (sel commençant par 6 $ )

Par exemple:

 $hashed = crypt('mypassword', '$1$somesalt$'); // utiliser MD5 cryptage

Lors de la vérification, il vous suffit de passer le mot de passe en texte clair et le hachage complet dans crypte () :

 if (crypt($inputPassword, $storedHash) === $storedHash) {
    // Correspondance de mot de passe
}

2. Concevoir des solutions de compatibilité

L'objectif est de permettre au nouveau système de prendre en charge à la fois l'ancien mot de passe de cryptage Crypt () et le mot de passe de cryptage moderne mot de passe_hash () , et de terminer les mises à niveau transparents lorsque l'utilisateur se connecte.

1. Restez compatible avec la structure de la base de données

Le champ de mot de passe de l'ancien système peut être nommé mot de passe et stocke le résultat de crypte () . Le nouveau système peut continuer à utiliser ce champ, ou il peut introduire un champ IS_LEGACY pour marquer si le mot de passe est l'ancienne méthode de chiffrement.

2. Logique de vérification de connexion

Lorsque l'utilisateur se connecte, le système doit déterminer le format de mot de passe stocké et utiliser la méthode de vérification correspondante:

 function verifyPassword($inputPassword, $storedHash) {
    if (password_get_info($storedHash)['algo'] !== 0) {
        // Oui password_hash() Format
        return password_verify($inputPassword, $storedHash);
    } else {
        // Oui crypt() Format
        return crypt($inputPassword, $storedHash) === $storedHash;
    }
}

3. Améliorer la méthode de chiffrement du mot de passe après la connexion

Une fois que vous vous êtes connecté avec succès avec l'ancien mot de passe, vous devez immédiatement réencroiter le mot de passe avec mot de passe_hash () et mettre à jour la base de données.

 function upgradePassword($userId, $inputPassword) {
    $newHash = password_hash($inputPassword, PASSWORD_DEFAULT);
    // 假设utiliser PDO Connectez-vous à la base de données
    $stmt = $pdo->prepare("UPDATE users SET password = :password WHERE id = :id");
    $stmt->execute(['password' => $newHash, 'id' => $userId]);
}

Après une vérification réussie, appelez cette fonction pour obtenir une mise à niveau transparente.

4. Évitez les attaques d'homme au milieu

Bien que Crypt () lui-même ne soit pas sûr, nous pouvons toujours réduire les risques via HTTPS et d'autres méthodes. Dans le système, assurez-vous de vous assurer que l'interface de connexion est chiffrée à l'aide de TLS / SSL.

Par exemple, utilisez l'interface de connexion suivante (pseudocode):

 $url = 'https://m66.net/api/login';

Cette interface doit être déployée dans un environnement de serveur sécurisé pour assurer la confidentialité et l'intégrité lors de la transmission des données.

3. Exemple de code final

Ce qui suit est une logique complète de traitement de connexion:

 function handleLogin($username, $inputPassword) {
    global $pdo;

    $stmt = $pdo->prepare("SELECT id, password FROM users WHERE username = :username");
    $stmt->execute(['username' => $username]);
    $user = $stmt->fetch();

    if (!$user) {
        return false;
    }

    $storedHash = $user['password'];
    if (verifyPassword($inputPassword, $storedHash)) {
        // 如果Oui旧Format密码,Procéder à la mise à niveau
        if (password_get_info($storedHash)['algo'] === 0) {
            upgradePassword($user['id'], $inputPassword);
        }
        return true;
    }

    return false;
}

Conclusion

Il s'agit d'une approche pragmatique pour conserver l'ancienne logique de vérification du mot de passe pendant la migration du système, ce qui garantit non seulement l'expérience utilisateur, mais ne sacrifie pas non plus la sécurité. Grâce à la méthode ci-dessus, nous pouvons obtenir un support compatible pour l'ancienne méthode de cryptage Crypt () et passer progressivement à un mécanisme de cryptage plus moderne à l'avenir pour améliorer la sécurité du système global. N'oubliez pas que la sécurité n'est pas seulement une option pour les algorithmes de chiffrement, mais également des considérations complètes pour la transmission des données, le stockage et l'architecture du système.