added hash

This commit is contained in:
Vladislav Khorev 2026-02-10 11:42:23 +03:00
parent 2c1c077611
commit 251a59ddbe
5 changed files with 58 additions and 7 deletions

View File

@ -129,6 +129,28 @@ public:
}); });
} }
bool IsMessageValid(const std::string& fullMessage) {
#ifdef ENABLE_NETWORK_CHECKSUM
size_t hashPos = fullMessage.find("#hash:");
if (hashPos == std::string::npos) {
return false; // Хеша нет, хотя он ожидался
}
std::string originalContent = fullMessage.substr(0, hashPos);
std::string receivedHashStr = fullMessage.substr(hashPos + 6); // 6 — длина "#hash:"
// Вычисляем ожидаемый хеш от контента
size_t expectedHash = std::hash<std::string>{}(originalContent + NET_SECRET);
std::stringstream ss;
ss << std::hex << expectedHash;
return ss.str() == receivedHashStr;
#else
return true; // В режиме отладки пропускаем всё
#endif
}
private: private:
/* /*
void init() { void init() {
@ -299,8 +321,17 @@ private:
} }
void process_message(const std::string& msg) { void process_message(const std::string& msg) {
std::cout << "Received from player " << id_ << ": " << msg << std::endl; if (!IsMessageValid(msg)) {
auto parts = split(msg, ':'); // Логируем попытку подмены и просто выходим из обработки
std::cout << "[Security] Invalid packet hash. Dropping message." << std::endl;
return;
}
std::string cleanMessage = msg.substr(0, msg.find("#hash:"));
std::cout << "Received from player " << id_ << ": " << cleanMessage << std::endl;
auto parts = split(cleanMessage, ':');
if (parts.empty()) return; if (parts.empty()) return;
@ -326,7 +357,7 @@ private:
receivedState.handle_full_sync(parts, 2); receivedState.handle_full_sync(parts, 2);
timedClientStates.add_state(receivedState); timedClientStates.add_state(receivedState);
retranslateMessage(msg); retranslateMessage(cleanMessage);
} }
else if (parts[0] == "RESPAWN") { else if (parts[0] == "RESPAWN") {
{ {

View File

@ -884,8 +884,8 @@ namespace ZL
int64_t localNow = std::chrono::duration_cast<std::chrono::milliseconds>( int64_t localNow = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch()).count(); std::chrono::system_clock::now().time_since_epoch()).count();
std::cout << "getSyncTimeMs localNow = " << localNow << std::endl; //std::cout << "getSyncTimeMs localNow = " << localNow << std::endl;
std::cout << "getSyncTimeMs getTimeOffset = " << networkClient->getTimeOffset() << std::endl; //std::cout << "getSyncTimeMs getTimeOffset = " << networkClient->getTimeOffset() << std::endl;
// Добавляем смещение, полученное от сервера // Добавляем смещение, полученное от сервера
return localNow + networkClient->getTimeOffset(); // Нужно добавить геттер в интерфейс return localNow + networkClient->getTimeOffset(); // Нужно добавить геттер в интерфейс
@ -917,7 +917,7 @@ namespace ZL
auto now_ms = newTickCount; auto now_ms = newTickCount;
std::cout << "processTickCount = " << now_ms << std::endl; //std::cout << "processTickCount = " << now_ms << std::endl;
sparkEmitter.update(static_cast<float>(delta)); sparkEmitter.update(static_cast<float>(delta));
planetObject.update(static_cast<float>(delta)); planetObject.update(static_cast<float>(delta));

View File

@ -9,6 +9,9 @@
using std::min; using std::min;
using std::max; using std::max;
constexpr auto NET_SECRET = "880b3713b9ff3e7a94b2712d54679e1f";
#define ENABLE_NETWORK_CHECKSUM
constexpr float ANGULAR_ACCEL = 0.005f * 1000.0f; constexpr float ANGULAR_ACCEL = 0.005f * 1000.0f;
constexpr float SHIP_ACCEL = 1.0f * 1000.0f; constexpr float SHIP_ACCEL = 1.0f * 1000.0f;
constexpr float ROTATION_SENSITIVITY = 0.002f; constexpr float ROTATION_SENSITIVITY = 0.002f;

View File

@ -78,7 +78,23 @@ namespace ZL {
void WebSocketClient::Send(const std::string& message) { void WebSocketClient::Send(const std::string& message) {
if (!connected) return; if (!connected) return;
auto ss = std::make_shared<std::string>(message); std::string finalMessage = message;
#ifdef ENABLE_NETWORK_CHECKSUM
// Вычисляем хеш. Для примера используем std::hash,
// но в продакшене лучше взять быструю реализацию типа MurmurHash3.
size_t hashValue = std::hash<std::string>{}(message + NET_SECRET);
// Преобразуем хеш в hex-строку для передачи
std::stringstream ss_hash;
ss_hash << std::hex << hashValue;
// Добавляем хеш в конец сообщения через разделитель
// Например: "UPD:12345:pos...#hash:a1b2c3d4"
finalMessage += "#hash:" + ss_hash.str();
#endif
auto ss = std::make_shared<std::string>(finalMessage);
std::lock_guard<std::mutex> lock(writeMutex_); std::lock_guard<std::mutex> lock(writeMutex_);
writeQueue_.push(ss); writeQueue_.push(ss);

View File

@ -6,6 +6,7 @@
namespace ZL { namespace ZL {
class WebSocketClientBase : public INetworkClient { class WebSocketClientBase : public INetworkClient {
protected: protected: