- Najpierw wygeneruj parę kluczy publiczny i prywatny do szyfrowania. Można to zrobić za pomocą narzędzi takich jak OpenSSL.
- Zaszyfruj hasło za pomocą klucza prywatnego. Spowoduje to utworzenie bezpiecznej, zaszyfrowanej wersji hasła, które można wysłać w żądaniu API.
- 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.
- 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.
- 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.