Magento 2:如何从数据库中重置客户密码


20

它是数据库中客户密码的哈希值。因此,MD5和Sha1无法正常工作。

UPDATE `customer_entity` SET `password` = MD5('test123') WHERE `email` = 'X@X.com';

那么如何使用数据库查询来更新密码。可能是MD5(Sha1('test123'))吗?

Magento如何通过代码进行操作。去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>");
}

请考虑接受@ 7ochem的回答。这个问题现在已经3岁了,目前还没有公认的答案。
达伦·费尔顿

Answers:


40

此SQL可以很好地更新客户密码。使用Magento 2.1.5测试。

只需更改下面的“ YOURPASSWORD”(保持xxx:es),瞧!

UPDATE `customer_entity`
SET `password_hash` = CONCAT(SHA2('xxxxxxxxYOURPASSWORD', 256), ':xxxxxxxx:1')
WHERE `entity_id` = 1;

4
请注意,这实际上将创建一个未加盐的密码。可以作为测试过程很好,但不应在生产中用作常规方法,否则会严重削弱安全性。请参阅@ 7ochem的答案以获取生成独特盐的更安全方法。
Scott Buchanan

任何方式!此解决方案正在工作..感谢@Robban
Irfan Momin

30

直到我看到Robban答案,再也没有想到直接在SQL中使用SHA哈希。我想补充一点,您也可以在SQL中生成哈希,仅保留应添加的密码。您可以使用变量(set-statement)预先设置所有必要的值:

SET @email='emailaddress@example.com', @passwd='test@123', @salt=MD5(RAND());

UPDATE customer_entity
    SET password_hash = CONCAT(SHA2(CONCAT(@salt, @passwd), 256), ':', @salt, ':1')
    WHERE email = @email;

我需要用生成的密码更新一个数据库的所有客户,有没有办法对所有表执行此操作?
Christophe Ferreboeuf

这是一个略有不同的问题,也许值得单独回答。您可以一个新问题吗?我很乐意回答。请不要忘记在问题中添加您的Magento版本
7ochem

您可能应该使用@Robban答案中的正确客户实体ID,而不是客户的电子邮件地址。在多商店模式下,有可能具有相同的电子邮件地址多次出现在customer_entity表中,并且您不想全部更新,除非您打算全部更新!
大教堂

7

我认为无法从数据库内部设置密码。您需要SHA256对客户密码进行哈希处理。这是Magento生成它的方式:

数据库中的示例密码:

7fe8104daf9ebd5c2ac427ec7312cd9456195b1a8ade188fa8bfd35e43bc0614:7ilBNt4q5xYUSMyv8UX2a7gkmwv051Pm:1

格式如下:

A:B:C

哪里

B = $salt= 32个字符的随机字符串

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

C =哈希算法版本(默认= 1)


你能举个例子吗?假设密码是test。PHP / Magento示例
Ankit Shah 2016年

7

您可以通过命令行(CLI)上的PHP轻松生成Magento 2样式的密码哈希。

使用此命令生成哈希,例如密码test123(将其更改为您自己的密码):

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

它使用当前大纪元时间(time())的MD5 作为盐,但您也可以使用其他任何东西。

复制此生成的哈希并将其粘贴到客户记录password_hash列上的查询或数据库管理工具中。


2

只需尝试下面的mysql查询

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

其中,entity_id是您的用户ID,这里有3个值,以:分隔

  1. 首先是密码的md5
  2. 第二个为空或为空,因为我们不使用任何盐
  3. 第三位是0表示使用md5

一旦您在db中运行此查询,然后使用上述密码登录并返回数据库表并检查密码,您将注意到magento自动将密码更改为标准magento2密码,即xxxxxx:yyyyyy:1

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.