Added different hash func
This commit is contained in:
parent
251a59ddbe
commit
210c191d41
@ -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:"));
|
||||
|
||||
10
src/Game.cpp
10
src/Game.cpp
@ -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;
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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 };
|
||||
|
||||
@ -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_);
|
||||
|
||||
@ -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_;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user