1. Najpierw wygeneruj parę kluczy publiczny i prywatny do szyfrowania. Można to zrobić za pomocą narzędzi takich jak OpenSSL.
  2. Zaszyfruj hasło za pomocą klucza prywatnego. Spowoduje to utworzenie bezpiecznej, zaszyfrowanej wersji hasła, które można wysłać w żądaniu API.
  3. Dołącz zaszyfrowane hasło i klucz publiczny do żądania API. Klucz publiczny jest niezbędny, aby serwer mógł odszyfrować hasło i zweryfikować autentyczność żądania.
  4. Wyślij żądanie API do serwera przy użyciu bezpiecznego protokołu, takiego jak HTTPS. Dzięki temu dane będą przesyłane w sposób bezpieczny i nie będą mogły zostać przechwycone przez złośliwe podmioty.
  5. Serwer użyje następnie klucza publicznego do odszyfrowania hasła i uwierzytelnienia żądania. Jeśli hasło jest prawidłowe, serwer przetworzy żądanie i zwróci odpowiednią odpowiedź.

Oto podstawowy przykład tego, jak można kodować, aby żądanie API było bezpieczne:

const crypto = require('crypto');

const newUserLogin = async (email: string, password: string, newPassword: string) => {
  const url = NEW_USER_LOGIN_ENDPOINT;

  // Encrypt the password and newPassword using a private key
  const privateKey = fs.readFileSync('private.pem', 'utf8');
  const passwordCipher = crypto.privateEncrypt(privateKey, Buffer.from(password, 'utf8'));
  const newPasswordCipher = crypto.privateEncrypt(privateKey, Buffer.from(newPassword, 'utf8'));

  // Read the public key
  const publicKey = fs.readFileSync('public.pem', 'utf8');

  // Send the API request with the encrypted password and newPassword, and the public key
  return await axios.post(
    url,
    {
      email: email,
      password: passwordCipher,
      newPassword: newPasswordCipher
    },
    {
      headers: {
        "Content-Type": "application/json",
        "public-key": publicKey
      },
      httpsAgent: new https.Agent({  
        rejectUnauthorized: true
      }),
    }
  );
};

Kod ten wykorzystuje bibliotekę kryptograficzną do szyfrowania hasła i nowego hasła przy użyciu klucza prywatnego, a następnie wysyła zaszyfrowane dane w żądaniu API. Klucz publiczny jest również zawarty w nagłówku żądania, dzięki czemu serwer może go użyć do odszyfrowania hasła i nowego hasła oraz sprawdzenia autentyczności żądania. Dodatkowo wykorzystuje protokół HTTPS do bezpiecznego przesyłania danych.

Należy pamiętać, że jest to tylko przykładowy kod i należy zastosować solidniejszą metodę i protokół szyfrowania, także po to, aby zapewnić bezpieczeństwo klucza prywatnego i publicznego oraz upewnić się, że serwer jest również bezpieczny i dostępny wyłącznie dla autoryzowanych personel.

W mojej poprzedniej odpowiedzi użyłem fs, który jest wbudowanym modułem Node.js, który pozwala na pracę z systemem plików. Moduł ten nie jest jednak dostępny w JavaScript po stronie przeglądarki, więc nie będzie działał w aplikacji opartej na przeglądarce.

Aby ten kod zadziałał, musisz użyć biblioteki kompatybilnej z przeglądarką, która umożliwia pracę z szyfrowaniem. Jedną z takich bibliotek jest crypto-js, którą można zainstalować za pomocą npm, a następnie zaimportować do swojego kodu.

Oto przykład kodu umożliwiającego użycie crypto-js:

import * as CryptoJS from 'crypto-js';

const newUserLogin = async (email: string, password: string, newPassword: string) => {
  const url = NEW_USER_LOGIN_ENDPOINT;

  // Encrypt the password and newPassword using a private key
  const privateKey = 'private_key';
  const passwordCipher = CryptoJS.AES.encrypt(password, privateKey).toString();
  const newPasswordCipher = CryptoJS.AES.encrypt(newPassword, privateKey).toString();

  // Read the public key
  const publicKey = 'public_key';

  // Send the API request with the encrypted password and newPassword, and the public key
  return await axios.post(
    url,
    {
      email: email,
      password: passwordCipher,
      newPassword: newPasswordCipher
    },
    {
      headers: {
        "Content-Type": "application/json",
        "public-key": publicKey
      },
      httpsAgent: new https.Agent({  
        rejectUnauthorized: true
      }),
    }
  );
};

Należy pamiętać, że jest to nadal uproszczona wersja procesu i istnieją bardziej niezawodne metody i protokoły szyfrowania, których można używać w przypadku żądań API. Klucz, który tutaj umieściłem, służy wyłącznie celom demonstracyjnym. Należy go zastąpić prawdziwym kluczem, który wygenerujesz i zapewnić mu bezpieczeństwo.

Uwaga: należy pamiętać, że ta metoda jest bezpieczna tylko wtedy, gdy klucz prywatny jest bezpieczny i chroniony, a serwer jest również bezpieczny i dostępny tylko dla upoważnionego personelu. Należy również pamiętać, że jest to uproszczona wersja procesu i istnieją bardziej niezawodne metody i protokoły szyfrowania, których można używać w przypadku żądań API.