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:"
|
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;
|
std::stringstream ss;
|
||||||
ss << std::hex << expectedHash;
|
ss << std::hex << expectedHash;
|
||||||
@ -323,7 +323,7 @@ private:
|
|||||||
void process_message(const std::string& msg) {
|
void process_message(const std::string& msg) {
|
||||||
if (!IsMessageValid(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;
|
return;
|
||||||
}
|
}
|
||||||
std::string cleanMessage = msg.substr(0, msg.find("#hash:"));
|
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();
|
//latestRemotePlayers = networkClient->getRemotePlayers();
|
||||||
|
|
||||||
auto now = std::chrono::system_clock::now();
|
//auto now = std::chrono::system_clock::now();
|
||||||
now -= std::chrono::milliseconds(CLIENT_DELAY);
|
//now -= std::chrono::milliseconds(CLIENT_DELAY);
|
||||||
|
|
||||||
for (auto const& [id, remotePlayer] : remotePlayerStates)
|
for (auto const& [id, remotePlayer] : remotePlayerStates)
|
||||||
{
|
{
|
||||||
@ -1000,17 +1000,17 @@ namespace ZL
|
|||||||
|
|
||||||
auto latestRemotePlayers = networkClient->getRemotePlayers();
|
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) {
|
for (auto const& [id, remotePlayer] : latestRemotePlayers) {
|
||||||
|
|
||||||
if (!remotePlayer.canFetchClientStateAtTime(nowRounded))
|
if (!remotePlayer.canFetchClientStateAtTime(nowRoundedWithDelay))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ClientState playerState = remotePlayer.fetchClientStateAtTime(nowRounded);
|
ClientState playerState = remotePlayer.fetchClientStateAtTime(nowRoundedWithDelay);
|
||||||
|
|
||||||
remotePlayerStates[id] = playerState;
|
remotePlayerStates[id] = playerState;
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,13 @@
|
|||||||
#include "ClientState.h"
|
#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) {
|
void ClientState::simulate_physics(size_t delta) {
|
||||||
if (discreteMag > 0.01f)
|
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 float PITCH_LIMIT = static_cast<float>(M_PI) / 9.f;//18.0f;
|
||||||
|
|
||||||
constexpr long long SERVER_DELAY = 0; //ms
|
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
|
constexpr long long CUTOFF_TIME = 5000; //ms
|
||||||
|
|
||||||
|
uint32_t fnv1a_hash(const std::string& data);
|
||||||
|
|
||||||
struct ClientState {
|
struct ClientState {
|
||||||
int id = 0;
|
int id = 0;
|
||||||
Eigen::Vector3f position = { 0, 0, 45000.0f };
|
Eigen::Vector3f position = { 0, 0, 45000.0f };
|
||||||
|
|||||||
@ -57,7 +57,7 @@ namespace ZL {
|
|||||||
std::lock_guard<std::mutex> lock(queueMutex);
|
std::lock_guard<std::mutex> lock(queueMutex);
|
||||||
|
|
||||||
while (!messageQueue.empty()) {
|
while (!messageQueue.empty()) {
|
||||||
|
/*
|
||||||
auto nowTime = std::chrono::system_clock::now();
|
auto nowTime = std::chrono::system_clock::now();
|
||||||
|
|
||||||
//Apply server delay:
|
//Apply server delay:
|
||||||
@ -65,7 +65,7 @@ namespace ZL {
|
|||||||
|
|
||||||
auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
|
auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||||
nowTime.time_since_epoch()
|
nowTime.time_since_epoch()
|
||||||
).count();
|
).count();*/
|
||||||
std::string msg = messageQueue.front();
|
std::string msg = messageQueue.front();
|
||||||
messageQueue.pop();
|
messageQueue.pop();
|
||||||
|
|
||||||
@ -78,8 +78,8 @@ namespace ZL {
|
|||||||
void WebSocketClient::Send(const std::string& message) {
|
void WebSocketClient::Send(const std::string& message) {
|
||||||
if (!connected) return;
|
if (!connected) return;
|
||||||
|
|
||||||
std::string finalMessage = message;
|
std::string finalMessage = SignMessage(message);
|
||||||
|
/*
|
||||||
#ifdef ENABLE_NETWORK_CHECKSUM
|
#ifdef ENABLE_NETWORK_CHECKSUM
|
||||||
// Вычисляем хеш. Для примера используем std::hash,
|
// Вычисляем хеш. Для примера используем std::hash,
|
||||||
// но в продакшене лучше взять быструю реализацию типа MurmurHash3.
|
// но в продакшене лучше взять быструю реализацию типа MurmurHash3.
|
||||||
@ -93,7 +93,7 @@ namespace ZL {
|
|||||||
// Например: "UPD:12345:pos...#hash:a1b2c3d4"
|
// Например: "UPD:12345:pos...#hash:a1b2c3d4"
|
||||||
finalMessage += "#hash:" + ss_hash.str();
|
finalMessage += "#hash:" + ss_hash.str();
|
||||||
#endif
|
#endif
|
||||||
|
*/
|
||||||
auto ss = std::make_shared<std::string>(finalMessage);
|
auto ss = std::make_shared<std::string>(finalMessage);
|
||||||
|
|
||||||
std::lock_guard<std::mutex> lock(writeMutex_);
|
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::vector<ProjectileInfo> WebSocketClientBase::getPendingProjectiles() {
|
||||||
std::lock_guard<std::mutex> lock(projMutex_);
|
std::lock_guard<std::mutex> lock(projMutex_);
|
||||||
auto copy = pendingProjectiles_;
|
auto copy = pendingProjectiles_;
|
||||||
|
|||||||
@ -39,6 +39,8 @@ namespace ZL {
|
|||||||
|
|
||||||
void HandlePollMessage(const std::string& msg);
|
void HandlePollMessage(const std::string& msg);
|
||||||
|
|
||||||
|
std::string SignMessage(const std::string& msg);
|
||||||
|
|
||||||
std::unordered_map<int, ClientStateInterval> getRemotePlayers() override {
|
std::unordered_map<int, ClientStateInterval> getRemotePlayers() override {
|
||||||
std::lock_guard<std::mutex> lock(playersMutex);
|
std::lock_guard<std::mutex> lock(playersMutex);
|
||||||
return remotePlayers;
|
return remotePlayers;
|
||||||
|
|||||||
@ -25,7 +25,9 @@ namespace ZL {
|
|||||||
|
|
||||||
void WebSocketClientEmscripten::Send(const std::string& message) {
|
void WebSocketClientEmscripten::Send(const std::string& message) {
|
||||||
if (connected && socket_ > 0) {
|
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