• 1404/01/15

مشکل در رمزگزاری دیتاها :

درود استاد وقتتون بخیر باشه

ی موردی که من جدیدا بهش برخوردم و خیلی خیلی فورسه اینکه من پروژه هام تازه شروع به استفاده کردن توی کشور های دیگه شده و ی باگ خیلی خیلی بدی پیش اومده و باگشم اینه :

import axios from "axios";
import crypto from "crypto";
import { errorTost } from "../utils/toast/reactTostify";

class Api {
  constructor() {
    this.axios = axios.create({
      baseURL: process.env.URL_API,
    });
    this.axios.defaults.headers.common["Accept"] = "application/json";
    this.axios.defaults.headers.post["Content-Type"] = "application/json";

    this.axios.interceptors.request.use((config) => {
      if (config.method === "post" && config.data) {
        // اضافه کردن نانس و تایم‌استمپ به درخواست
        config.headers["Authorization"] = this.encryptData(process.env.API_TOKEN);
        // رمزگذاری داده‌ها قبل از ارسال
        config.data = this.encryptData(config.data);
      }
      return config;
    });

    this.axios.interceptors.response.use(
      (response) => {
        if (response.data && response.data.encryptedData) {
          response.data = this.decryptData(response.data);
        }
        return response;
      },
      (error) => {
        // در اینجا ارور را مدیریت می‌کنیم
        errorTost("خطا در ارتباط با سرور ، صفحه مجددا رفرش میشود");
        // بررسی وضعیت تب مرورگر
        if (document.visibilityState === "visible") {
          setTimeout(() => {
            window.location.reload();
          }, 4000);
        }
        return Promise.reject(error);
      }
    );
  }

  // تابع برای ایجاد نانس منحصر به فرد
  generateNonce() {
    return Math.random().toString(36).substr(2, 9); // نانس تصادفی 9 رقمی
  }
 
  // رمزگذاری داده‌ها (پیش از ارسال به API)
  encryptData(data) {
    const passphrase = process.env.API_TOKEN_PASSPHRASE;
    const iv = crypto.randomBytes(12);
    const cipher = crypto.createCipheriv("aes-256-gcm", Buffer.from(passphrase, "utf-8"), iv);

    const expirationTime = Date.now();

    const dataWithExpiration = {
      ...data,
      exp: expirationTime,
    };

    let encrypted = cipher.update(JSON.stringify(dataWithExpiration), "utf-8", "hex");
    encrypted += cipher.final("hex");
    const authTag = cipher.getAuthTag().toString("hex");

    return {
      iv: iv.toString("hex"),
      authTag,
      encryptedData: encrypted,
    };
  }

  // رمزگشایی داده‌ها (پس از دریافت از API)
  decryptData(encryptedData) {
    const { iv, authTag, encryptedData: data } = encryptedData;
    const passphrase = process.env.API_TOKEN_PASSPHRASE;
    const decipher = crypto.createDecipheriv("aes-256-gcm", Buffer.from(passphrase, "utf-8"), Buffer.from(iv, "hex"));
    decipher.setAuthTag(Buffer.from(authTag, "hex"));

    let decrypted = decipher.update(data, "hex", "utf-8");
    decrypted += decipher.final("utf-8");
    const parsedData = JSON.parse(decrypted);

    return parsedData;
  }

اگه دقت کنید من میام دیتاهارو رمز گزاری میکنم و ارسال میکنم و توی این مورد مشکلی ندارم

مشکلی که هست مربوط به تایم دیتاهاست من میام با متغیرexp زمان فعلی که date.now هست رو همراه دیتاها ارسال میکنم و سمت بک اندم هم مجدد همین کارو میکنم و زمان حال رو میگیرم و اگر زمان ارسال حداکثر تا 5 ثانیه کوچیک تر از زمان فعلی بودن میزارم پردازش بشه ولی اگه توی بازه ی زمانی این مقدار نبود امکان پردازش رو نمیدم

یعنی ی جورایی واسه هر داده 5 ثانیه زمان منقضی شدن میدم

این کامل اوکیه تا وقتی که زمان Date.now() روی مرورگر کاربر با زمان سرور من تفاوت داره و من حداکثر 1 تایم زمانی میتونم روی سرورم تنظیم کنم

یعنی اگه کاربر داخل ایران زمانش x باشه و سرور من هم ساعتش روی ایران تنظیم شده باشه زمان x رو برمیگردونه

کاربر خارج زمانش x + n هست و همین باعث میشه هیچ وقت دیتاش پردازش نشه !

من اومدم کد زدم که زمان رو از ی api از سرورم بگیره که برای همه یکسان باشه ولی اینکار باعث شده تعداد درخواست ها چند برابر بشه به سرورم و اصلا ایده جالبی نبود ، جدا از اینکه بعضی اوقات هم این مشکل حل نمیشد بدلیل سرعت پردازش ها یا سرعت نت کاربر توی ایران

برای همین الان راه حل چیست ؟ پکیچی واسه اینکار وجود داره که من نخام اینارو خودم دستی هندل کنم و خود پکیجه ی زمانی واسه خود دیتاش داشته باشه؟

ممنون

  • 1404/01/16
  • ساعت 03:59

وقت بخیر دوست عزیز.
من همین متن خودتون رو در چت جی پی تی زدم و فکر میکنم راه حل های خوبی ارايه داده.
لینک صفحه چت


  • 1404/01/17
  • ساعت 14:44

سلام دوست من

راهکارهایی که پیشنهاد شده رو چک کن اگه مشکلت حل نشد بگو تا بیشتر بررسی کنیم


  • 1404/01/25
  • ساعت 10:07

درود

ممنون از راهنماییتون

ار راهکار دوستمون استفاده کردم البته با کمی تغییرات بیشتر و یکمی پیچ و تابش دادم

https://uploadkon.ir/uploads/7b5914_2520250414-095236.mp4

این ویدئو رو نگاه کنید و اگر مشکلی بود بهم بگین


logo-enamadlogo-samandehi