我正在尝试通过Magento Go SOAP API对用户进行身份验证,并且在生成匹配的哈希时遇到问题。根据文档,password_hash包含密码:salt但是当我md5时它与password_hash不匹配。
示例:
1)我通过管理员控制面板将密码更改为“testtest”
2)运行以下代码:
$client = new SoapClient('http://XXXX.gostorego.com/api/v2_soap/?wsdl');
$session = $client->login($api_user, $api_pass);
$params = array('filter'=>array(array('key'=>'email','value'=>'user@domain.com')));
$data = $client->customerCustomerList($session, $params);
echo '<pre>CUSTOMER: '.print_r($data, true).'</pre>';
if (count($data)) {
$hash = explode(':',$data[0]->password_hash);
$salt = $hash[1];
echo '<pre>HASH PARTS:'.print_r($hash, true).'</pre>';
echo '<br>' .md5($salt.$password);
}
3)password_hash是f35604820826428dd7633b91cd6078f4075c9bfa1a37db7bc70f563475ad8495:qK
4)MD5为0b04a656c770ba2f10b5918f94529cd8
答案 0 :(得分:2)
我从未使用过Magento Go(我不确定它是否支持/可能),但是哈希字符串
f35604820826428dd7633b91cd6078f4075c9bfa1a37db7bc70f563475ad8495:qK
太长,不能成为字符串的MD5哈希值。这是一个64字节的哈希值(加上:
加上盐qK
)。我的猜测是SHA256,但这是基于字符长度的猜测。
答案 1 :(得分:0)
在后端,Md5和SHA都得到支持,更新的支持倾向于SHA(在企业中)。
如果您的密码是:12341234
DB Hash实际上类似于:cdb757ce51af9749d2fabea4cf71dc72a1ec7b8721e5f8de83020f574ca3c5f1:TR
但是,远程连接应该是&#34; https:&#34;通过SSL获取WSDL文件,您应该以普通/纯文本形式输入SOAP API密钥。 即:
如果您想为自己的内部目的复制散列,则需要查看其方法:class Mage_Core_Model_Encryption
public function hash($data)
{
return md5($data);
}
/**
* Validate hash against hashing method (with or without salt)
*
* @param string $password
* @param string $hash
* @return bool
* @throws Exception
*/
public function validateHash($password, $hash)
{
$hashArr = explode(':', $hash);
switch (count($hashArr)) {
case 1:
return $this->hash($password) === $hash;
case 2:
return $this->hash($hashArr[1] . $password) === $hashArr[0];
}
Mage::throwException('Invalid hash.');
}
企业:
public function hash($data, $version = self::HASH_VERSION_LATEST)
{
if (self::HASH_VERSION_MD5 === $version) {
return md5($data);
}
return hash('sha256', $data);
}
/**
* Validate hash by specified version
*
* @param string $password
* @param string $hash
* @param int $version
* @return bool
*/
public function validateHashByVersion($password, $hash, $version = self::HASH_VERSION_LATEST)
{
// look for salt
$hashArr = explode(':', $hash, 2);
if (1 === count($hashArr)) {
return $this->hash($password, $version) === $hash;
}
list($hash, $salt) = $hashArr;
return $this->hash($salt . $password, $version) === $hash;
}