Magento 2: Comment réinitialiser le mot de passe client à partir de la base de données

19

C'est un hachage pour le mot de passe client dans DB. Donc MD5 & Sha1 ne fonctionne pas.

UPDATE `customer_entity` SET `password` = MD5('test123') WHERE `email` = '[email protected]';

Alors, comment mettre à jour le mot de passe à l'aide d'une requête de base de données. Peut-être MD5(Sha1('test123'))?

Comment fonctionne Magento via le code. aller àvendor\magento\module-customer\Console\Command\UpgradeHashAlgorithmCommand.php

protected function execute(InputInterface $input, OutputInterface $output)
{
    $this->collection = $this->customerCollectionFactory->create();
    $this->collection->addAttributeToSelect('*');
    $customerCollection = $this->collection->getItems();
    /** @var $customer Customer */
    foreach ($customerCollection as $customer) {
        $customer->load($customer->getId());
        if (!$this->encryptor->validateHashVersion($customer->getPasswordHash())) {
            list($hash, $salt, $version) = explode(Encryptor::DELIMITER, $customer->getPasswordHash(), 3);
            $version .= Encryptor::DELIMITER . Encryptor::HASH_VERSION_LATEST;
            $customer->setPasswordHash($this->encryptor->getHash($hash, $salt, $version));
            $customer->save();
            $output->write(".");
        }
    }
    $output->writeln(".");
    $output->writeln("<info>Finished</info>");
}
Ankit Shah
la source
Veuillez envisager d'accepter la réponse de @ 7ochem. Cette question a maintenant 3 ans et aucune réponse n'est acceptée.
Darren Felton

Réponses:

38

Ce SQL fonctionne très bien pour mettre à jour le mot de passe client. Testé avec Magento 2.1.5.

Changez juste "VOTRE MOT DE PASSE" ci-dessous (gardez le xxx: es) et le tour est joué!

UPDATE `customer_entity`
SET `password_hash` = CONCAT(SHA2('xxxxxxxxYOURPASSWORD', 256), ':xxxxxxxx:1')
WHERE `entity_id` = 1;
Robban
la source
4
Notez que cela créera essentiellement un mot de passe non salé. C'est très bien comme procédure de test, mais ne devrait pas être utilisé comme méthode régulière dans la production ou cela affaiblira considérablement la sécurité. Voir la réponse de @ 7ochem pour une approche plus sécurisée qui génère des sels uniques.
Scott Buchanan
En tous cas! Cette solution fonctionne .. Merci @Robban
Irfan Momin
30

Je n'ai jamais pensé à utiliser le hachage SHA en SQL directement avant d'avoir vu la réponse de Robban . Je voudrais ajouter que vous pouvez également générer le hachage en SQL, en ne laissant que le mot de passe à ajouter. Vous pouvez utiliser des variables ( set-statement ) pour définir toutes les valeurs nécessaires à l'avance:

SET @email='[email protected]', @passwd='test@123', @salt=MD5(RAND());

UPDATE customer_entity
    SET password_hash = CONCAT(SHA2(CONCAT(@salt, @passwd), 256), ':', @salt, ':1')
    WHERE email = @email;
7ochem
la source
J'ai besoin de mettre à jour tous les clients d'une base de données avec le mot de passe généré, existe-t-il un moyen de le faire pour toute la table?
Christophe Ferreboeuf
Il s'agit d'une question légèrement différente, qui mérite peut-être d'y répondre séparément. Pouvez-vous poser cette question comme une nouvelle question? Je suis heureux de répondre à cela. N'oubliez pas d'ajouter votre version de Magento dans la question
7ochem
7

Je ne pense pas qu'il soit possible de définir le mot de passe depuis l'intérieur de la base de données. Vous devez SHA256hacher les mots de passe des clients. Voici comment Magento le génère:

exemple de mot de passe dans DB:

7fe8104daf9ebd5c2ac427ec7312cd9456195b1a8ade188fa8bfd35e43bc0614: 7ilBNt4q5xYUSMyv8UX2a7gkmwv051Pm: 1

c'est le format:

ABC

B = $salt= chaîne aléatoire de 32 caractères

A = hash('sha256', $salt . $password);

C = version de l'algorithme de hachage (par défaut = 1)

Aaron Allen
la source
Pouvez-vous donner avec exemple @Aaron. Supposons que le mot de passe soit test. Exemple PHP / Magento
Ankit Shah
7

Vous pouvez générer un hachage de mot de passe de style Magento 2 assez facilement via PHP en ligne de commande (CLI).

Utilisez cette commande pour générer un hachage, comme exemple de mot de passe test123(changez-le en votre propre mot de passe):

php -r '$salt=md5(time());
  echo hash("sha256", $salt.$argv[1]).":$salt:1\n";' test123

Il utilise MD5 du temps Epoch actuel ( time()) comme sel, mais vous pouvez également utiliser autre chose.

Copiez ce hachage généré et collez-le dans votre requête ou votre outil de gestion de base de données sur la password_hashcolonne d' un enregistrement client .

7ochem
la source
2

Essayez simplement la requête mysql ci-dessous

update customer_entity set password_hash = CONCAT(md5('test123'),"::0") where entity_id = 233;

Où entity_id est votre identifiant utilisateur Il y a 3 valeurs séparées par: signe Dans notre cas

  1. Le premier est le md5 du mot de passe
  2. La seconde est vide ou nulle car nous n'utilisons aucun sel
  3. Le troisième est 0 pour indiquer l'utilisation de md5

Une fois que vous exécutez cette requête dans db, puis connectez-vous en utilisant le mot de passe mentionné et revenez à la table de base de données et vérifiez le mot de passe, vous remarquerez que magento a automatiquement changé le mot de passe en mot de passe standard magento2, c'est-à-dire xxxxxx: yyyyyy: 1

AbdulBasit
la source