Метод работает на C ++, но как воспроизвести то же самое в PHP?

У меня есть следующий код на C ++

std::string Battlenet::AccountMgr::CalculateShaPassHash(std::string const& name, std::string const& password)
{
SHA256Hash email;
email.UpdateData(name);
email.Finalize();

SHA256Hash sha;
sha.UpdateData(ByteArrayToHexStr(email.GetDigest(), email.GetLength()));
sha.UpdateData(":");
sha.UpdateData(password);
sha.Finalize();

return ByteArrayToHexStr(sha.GetDigest(), sha.GetLength(), true);
}

std::string ByteArrayToHexStr(uint8 const* bytes, uint32 arrayLen, bool reverse /* = false */)
{
int32 init = 0;
int32 end = arrayLen;
int8 op = 1;

if (reverse)
{
init = arrayLen - 1;
end = -1;
op = -1;
}

std::ostringstream ss;
for (int32 i = init; i != end; i += op)
{
char buffer[4];
sprintf(buffer, "%02X", bytes[i]);
ss << buffer;
}

return ss.str();
}

Я пытаюсь воспроизвести тот же результат на PHP, и то, что я сделал до сих пор:

public function RegisterBattleNetAccount($email, $password)
{
$GLOBALS['mysqli']->query("use {$GLOBALS['db_auth']}");
//strtoupper
$pass = hash('sha256', strrev(strtoupper(hash('sha256', $email))).':'.$password);
$pass = strtoupper(strrev($pass));
$email = strtoupper($email);
$stmt = $GLOBALS['mysqli']->prepare("INSERT INTO battlenet_accounts (`email`,`sha_pass_hash`) VALUES (?, ?)");

$stmt->bind_param("ss", $email, $pass);
$stmt->execute();
}

Результаты:

C++: 09FEBAB417CF2FA563AC89963519CCAC53D5F556F8BF20D7EEB818A0584A514E
PHP: 4e514a58a018b8eed720bff856f5d553accc19359689ac63a52fcf17b4bafe09

Что я могу сделать, чтобы получить тот же результат, что и C ++?

0

Решение

Если вы посмотрите внимательно, вы увидите, что (несмотря на случай) оба результата одинаковы, за исключением того, что каждая шестнадцатеричная пара записывается в обратном порядке.

Ваша версия C ++ называется с reverse как true; так что просто не делай этого!

(Затем установите согласованность между двумя программами.)

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]