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

0

У меня есть следующий код на 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 ++.
  • 0
    Пример вашего $email адреса был бы хорош.
Показать ещё 16 комментариев
Теги:
hashcode

1 ответ

4
Лучший ответ

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

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

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

  • 0
    Как я могу обратить это в PHP?
  • 0
    извините вы правы! :) Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню