Added different hash func

This commit is contained in:
Vladislav Khorev 2026-02-10 21:06:21 +03:00
parent 251a59ddbe
commit 210c191d41
8 changed files with 39 additions and 14 deletions

View File

@ -140,7 +140,7 @@ public:
std::string receivedHashStr = fullMessage.substr(hashPos + 6); // 6 — длина "#hash:"
// Вычисляем ожидаемый хеш от контента
size_t expectedHash = std::hash<std::string>{}(originalContent + NET_SECRET);
size_t expectedHash = fnv1a_hash(originalContent + NET_SECRET);
std::stringstream ss;
ss << std::hex << expectedHash;
@ -323,7 +323,7 @@ private:
void process_message(const std::string& msg) {
if (!IsMessageValid(msg)) {
// Логируем попытку подмены и просто выходим из обработки
std::cout << "[Security] Invalid packet hash. Dropping message." << std::endl;
std::cout << "[Security] Invalid packet hash. Dropping message: " << msg << std::endl;
return;
}
std::string cleanMessage = msg.substr(0, msg.find("#hash:"));

View File

@ -839,8 +839,8 @@ namespace ZL
// Берем удаленных игроков
//latestRemotePlayers = networkClient->getRemotePlayers();
auto now = std::chrono::system_clock::now();
now -= std::chrono::milliseconds(CLIENT_DELAY);
//auto now = std::chrono::system_clock::now();
//now -= std::chrono::milliseconds(CLIENT_DELAY);
for (auto const& [id, remotePlayer] : remotePlayerStates)
{
@ -1000,17 +1000,17 @@ namespace ZL
auto latestRemotePlayers = networkClient->getRemotePlayers();
std::chrono::system_clock::time_point nowRounded{ std::chrono::milliseconds(newTickCount) };
std::chrono::system_clock::time_point nowRoundedWithDelay{ std::chrono::milliseconds(newTickCount-CLIENT_DELAY) };
for (auto const& [id, remotePlayer] : latestRemotePlayers) {
if (!remotePlayer.canFetchClientStateAtTime(nowRounded))
if (!remotePlayer.canFetchClientStateAtTime(nowRoundedWithDelay))
{
continue;
}
ClientState playerState = remotePlayer.fetchClientStateAtTime(nowRounded);
ClientState playerState = remotePlayer.fetchClientStateAtTime(nowRoundedWithDelay);
remotePlayerStates[id] = playerState;

View File

@ -1,5 +1,13 @@
#include "ClientState.h"
uint32_t fnv1a_hash(const std::string& data) {
uint32_t hash = 0x811c9dc5;
for (unsigned char c : data) {
hash ^= c;
hash *= 0x01000193;
}
return hash;
}
void ClientState::simulate_physics(size_t delta) {
if (discreteMag > 0.01f)

View File

@ -23,9 +23,11 @@ constexpr float PLANET_MAX_ANGULAR_VELOCITY = 10.f;
constexpr float PITCH_LIMIT = static_cast<float>(M_PI) / 9.f;//18.0f;
constexpr long long SERVER_DELAY = 0; //ms
constexpr long long CLIENT_DELAY = 1000; //ms
constexpr long long CLIENT_DELAY = 500; //ms
constexpr long long CUTOFF_TIME = 5000; //ms
uint32_t fnv1a_hash(const std::string& data);
struct ClientState {
int id = 0;
Eigen::Vector3f position = { 0, 0, 45000.0f };

View File

@ -57,7 +57,7 @@ namespace ZL {
std::lock_guard<std::mutex> lock(queueMutex);
while (!messageQueue.empty()) {
/*
auto nowTime = std::chrono::system_clock::now();
//Apply server delay:
@ -65,7 +65,7 @@ namespace ZL {
auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
nowTime.time_since_epoch()
).count();
).count();*/
std::string msg = messageQueue.front();
messageQueue.pop();
@ -78,8 +78,8 @@ namespace ZL {
void WebSocketClient::Send(const std::string& message) {
if (!connected) return;
std::string finalMessage = message;
std::string finalMessage = SignMessage(message);
/*
#ifdef ENABLE_NETWORK_CHECKSUM
// Вычисляем хеш. Для примера используем std::hash,
// но в продакшене лучше взять быструю реализацию типа MurmurHash3.
@ -93,7 +93,7 @@ namespace ZL {
// Например: "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_);

View File

@ -251,6 +251,17 @@ namespace ZL {
}
}
std::string WebSocketClientBase::SignMessage(const std::string& msg) {
#ifdef ENABLE_NETWORK_CHECKSUM
size_t hashValue = fnv1a_hash(msg + NET_SECRET);
std::stringstream ss;
ss << msg << "#hash:" << std::hex << hashValue;
return ss.str();
#else
return msg;
#endif
}
std::vector<ProjectileInfo> WebSocketClientBase::getPendingProjectiles() {
std::lock_guard<std::mutex> lock(projMutex_);
auto copy = pendingProjectiles_;

View File

@ -39,6 +39,8 @@ namespace ZL {
void HandlePollMessage(const std::string& msg);
std::string SignMessage(const std::string& msg);
std::unordered_map<int, ClientStateInterval> getRemotePlayers() override {
std::lock_guard<std::mutex> lock(playersMutex);
return remotePlayers;

View File

@ -25,7 +25,9 @@ namespace ZL {
void WebSocketClientEmscripten::Send(const std::string& message) {
if (connected && socket_ > 0) {
emscripten_websocket_send_utf8_text(socket_, message.c_str());
auto signedMsg = SignMessage(message);
std::cout << "[WebWS] Sending message: " << signedMsg << std::endl;
emscripten_websocket_send_utf8_text(socket_, signedMsg.c_str());
}
}