magento 中的哈希密码功能是否已更改?如果是这样,为了什么?
Has the hash password function changed in magento? If so, to what?
我使用的是 magento 版本 1.9.0.1。
为了切换到 magento,我需要为 magento 框架之外的客户创建一个登录功能。
我查找了 magento 用于散列和验证密码的方法,但该方法似乎不再有效。
下面是我用来在 magento 之外验证用户登录的代码。这段代码只是为了尝试概念验证,出于显而易见的原因并未在实际环境中使用 :).
function checkPassword($entity,$passwordInput){
$query = mysql_query("SELECT value FROM customer_entity_varchar WHERE entity_id = '$entity' AND attribute_id = '12' LIMIT 1");
$fetch = mysql_fetch_object($query);
$fetch_data = explode(':',$fetch->value);
$hashed_password = $fetch_data['0'];
$salt = $fetch_data['1'];
$hashInput = md5($passwordInput . $salt);
if($hashInput == $hashed_password){
return 'Success';
}
else{
return 'Failure';
}
}
$entity
是邮箱验证后通过的entity_id,
$passwordInput
是在登录表单中输入的密码。
它 returns 失败。我对此并不感到惊讶,因为当我 return $hashInput
并将其与 $hashed_password
进行比较时,它是不一样的。
Magento 散列密码的方式是否已更改?还是我的代码有错误?
如果你签到 \app\code\core\Mage\Customer\Model\Customer.php
你可以找到类似这样的东西 (430 行附近) :
/**
* Encrypt password
*
* @param string $password
* @return string
*/
public function encryptPassword($password)
{
return Mage::helper('core')->encrypt($password);
}
helper('core')
是\app\code\core\Mage\Core\Helper\Data.php
在 \app\code\core\Mage\Core\Helper\Data.php
中,您找到:
/**
* Encrypt data using application key
*
* @param string $data
* @return string
*/
public function encrypt($data)
{
if (!Mage::isInstalled()) {
return $data;
}
return $this->getEncryptor()->encrypt($data);
}
和getEncryptor()
函数是:
/**
* @return Mage_Core_Model_Encryption
*/
public function getEncryptor()
{
if ($this->_encryptor === null) {
$encryptionModel = (string)Mage::getConfig()->getNode(self::XML_PATH_ENCRYPTION_MODEL);
if ($encryptionModel) {
$this->_encryptor = new $encryptionModel;
} else {
$this->_encryptor = Mage::getModel('core/encryption');
}
$this->_encryptor->setHelper($this);
}
return $this->_encryptor;
}
$this->_encryptor
位于 \app\code\core\Mage\Core\Model\Encryption.php
中,在此文件中您可以找到:
/**
* Encrypt a string
*
* @param string $data
* @return string
*/
public function encrypt($data)
{
return base64_encode($this->_getCrypt()->encrypt((string)$data));
}
和
/**
* Instantiate crypt model
*
* @param string $key
* @return Varien_Crypt_Mcrypt
*/
protected function _getCrypt($key = null)
{
if (!$this->_crypt) {
if (null === $key) {
$key = (string)Mage::getConfig()->getNode('global/crypt/key');
}
$this->_crypt = Varien_Crypt::factory()->init($key);
}
return $this->_crypt;
}
(string)Mage::getConfig()->getNode('global/crypt/key');
在 /app/etc/local.xml
文件中。
您的变量 $hashed_password
通过最后一种方法传递。
你的变量$hashInput
也传到那里了?
因此,您可以更改 checkPassword()
函数:
$hashInput = md5($passwordInput . $salt);
到
$hashInput = encryptPassword($passwordInput);
因此,$hashInput
和 $hashed_password
将遵循相同的方式。
我使用的是 magento 版本 1.9.0.1。
为了切换到 magento,我需要为 magento 框架之外的客户创建一个登录功能。
我查找了 magento 用于散列和验证密码的方法,但该方法似乎不再有效。
下面是我用来在 magento 之外验证用户登录的代码。这段代码只是为了尝试概念验证,出于显而易见的原因并未在实际环境中使用 :).
function checkPassword($entity,$passwordInput){
$query = mysql_query("SELECT value FROM customer_entity_varchar WHERE entity_id = '$entity' AND attribute_id = '12' LIMIT 1");
$fetch = mysql_fetch_object($query);
$fetch_data = explode(':',$fetch->value);
$hashed_password = $fetch_data['0'];
$salt = $fetch_data['1'];
$hashInput = md5($passwordInput . $salt);
if($hashInput == $hashed_password){
return 'Success';
}
else{
return 'Failure';
}
}
$entity
是邮箱验证后通过的entity_id,
$passwordInput
是在登录表单中输入的密码。
它 returns 失败。我对此并不感到惊讶,因为当我 return $hashInput
并将其与 $hashed_password
进行比较时,它是不一样的。
Magento 散列密码的方式是否已更改?还是我的代码有错误?
如果你签到 \app\code\core\Mage\Customer\Model\Customer.php
你可以找到类似这样的东西 (430 行附近) :
/**
* Encrypt password
*
* @param string $password
* @return string
*/
public function encryptPassword($password)
{
return Mage::helper('core')->encrypt($password);
}
helper('core')
是\app\code\core\Mage\Core\Helper\Data.php
在 \app\code\core\Mage\Core\Helper\Data.php
中,您找到:
/**
* Encrypt data using application key
*
* @param string $data
* @return string
*/
public function encrypt($data)
{
if (!Mage::isInstalled()) {
return $data;
}
return $this->getEncryptor()->encrypt($data);
}
和getEncryptor()
函数是:
/**
* @return Mage_Core_Model_Encryption
*/
public function getEncryptor()
{
if ($this->_encryptor === null) {
$encryptionModel = (string)Mage::getConfig()->getNode(self::XML_PATH_ENCRYPTION_MODEL);
if ($encryptionModel) {
$this->_encryptor = new $encryptionModel;
} else {
$this->_encryptor = Mage::getModel('core/encryption');
}
$this->_encryptor->setHelper($this);
}
return $this->_encryptor;
}
$this->_encryptor
位于 \app\code\core\Mage\Core\Model\Encryption.php
中,在此文件中您可以找到:
/**
* Encrypt a string
*
* @param string $data
* @return string
*/
public function encrypt($data)
{
return base64_encode($this->_getCrypt()->encrypt((string)$data));
}
和
/**
* Instantiate crypt model
*
* @param string $key
* @return Varien_Crypt_Mcrypt
*/
protected function _getCrypt($key = null)
{
if (!$this->_crypt) {
if (null === $key) {
$key = (string)Mage::getConfig()->getNode('global/crypt/key');
}
$this->_crypt = Varien_Crypt::factory()->init($key);
}
return $this->_crypt;
}
(string)Mage::getConfig()->getNode('global/crypt/key');
在 /app/etc/local.xml
文件中。
您的变量 $hashed_password
通过最后一种方法传递。
你的变量$hashInput
也传到那里了?
因此,您可以更改 checkPassword()
函数:
$hashInput = md5($passwordInput . $salt);
到
$hashInput = encryptPassword($passwordInput);
因此,$hashInput
和 $hashed_password
将遵循相同的方式。