So generieren Sie eine Ressourcenkennung mit Prüfsumme in Node.js
Eindeutige Bezeichner (UIDs) oder Kennungen können ein Stringwert oder eine Ganzzahl sein, und API-Entwickler verwenden sie oft, um eindeutige Ressourcen in einer API zu adressieren. API-Nutzer verwenden diese Kennungen dann, um eine einzelne Ressource aus einer Sammlung von Ressourcen abzurufen. Ohne eine eindeutige Kennung ist es nahezu unmöglich, die Ressourcen zu trennen und sie nach Bedarf aufzurufen. Kennungen können sich auf Datenbankstrukturelemente beziehen, wie die Namen von Tabellen, Feldern (Spalten) in einer Tabelle oder Einschränkungen, und können weiter auf ein eindeutiges Element in der Datenbank spezifiziert sein. Zum Beispiel könnte in einer Datenbank, die mit einem Hotelbuchungsportal zusammenhängt, Hotel(id) auf eine Kennung verweisen, die sich auf ein einzigartiges Hotel bezieht. Mit Hotel(id=1234, name=“Hyatt“) könnten Sie dieses spezielle Hotel anhand der ID 1234 oder des Namens „Hyatt“ identifizieren.
Merkmale einer guten Ressourcenkennung
In API Design Patterns identifiziert John J. Geewax sieben grundlegende Merkmale einer guten Kennung. Diese Merkmale sind beim Generieren einer eindeutigen ID zu berücksichtigen:
- Benutzerfreundlich: Eine Kennung sollte reservierte Zeichen wie den Schrägstrich (/) vermeiden, da diese Zeichen in URLs spezifische Bedeutungen haben.
- Eindeutig: Eine Kennung sollte eine einzelne Ressource in einer API referenzieren können.
- Schnell generierbar: Der Prozess zur ID-Generierung sollte in einer vorhersehbaren Weise funktionieren, um Konsistenz beim Skalieren sicherzustellen.
- Unvorhersehbar: Wenn eine Kennung unvorhersehbar ist, bietet sie Sicherheitsvorteile im Bereich der Schwachstellenverwaltung.
- Lesbar: Eine Kennung sollte für Menschen lesbar sein, was durch das Vermeiden von Zeichen wie der Ziffer 1, dem kleinen L, dem großen I oder dem Pipe-Zeichen (|) zu erreichen ist, da diese Zeichen Verwirrung stiften können, wenn jemand die ID manuell überprüfen muss.
- Verifizierbar: Ein Prüfsummenzeichen verwendet man, um die ID während einer Integritätsprüfung zu verifizieren.
- Dauerhaft: Einmal vergeben, sollten Kennungen sich nicht ändern.
Hinweis: Eine Änderung der Kennung kann unerwartete Verwirrung verursachen. Wenn Sie eine Kennung haben, die Hotel(id=1234, name=“Hyatt“) angibt und später in Hotel(id=5678, name=“Hyatt“) sich ändert, könnte die frühere ID wieder Verwendung finden. Und wenn die frühere Kennung verfügbar ist und sie ein neues Hotel als Hotel(id=1234, name=“Grand Villa“) erstellen, verwendet dieses neue Hotel die ursprüngliche Kennung (1234) erneut. Wenn Sie dann nach Hotel 1234 fragen, könnten Sie andere Ergebnisse als erwartet erhalten.
Generieren einer eindeutigen Kennung
In diesem Tutorial erstellen Sie eine eindeutige benutzerdefinierte Ressourcenkennung, die diese Merkmale erfüllt, sowie eine zugehörige Prüfsumme mit Node.JS generieren. Eine Prüfsumme ist ein Hash eines digitalen Fingerabdrucks einer Datei oder digitaler Daten. Eine Hash-Funktion auf dem digitalen Objekt erzeugt sie. Die Prüfsumme dieses Tutorials ist ein einzelnes alphanumerisches Zeichen, das durch einen algorithmischen Kodierungsprozess (oder Hashing) der Byte-Größe Ihrer Ressource abgeleitet wird.
Voraussetzungen
Bevor Sie mit diesem Tutorial beginnen, benötigen Sie Folgendes:
- Node.js auf Ihrem Rechner installiert, das Sie durch die Anleitung „So installieren Sie Node.js“ einrichten können. Dieses Tutorial wurde mit Node.JS Version 16.16.0 getestet.
- Grundkenntnisse in Node.js. Erfahren Sie mehr in der Serie „So programmieren Sie in Node.js“.
- Grundkenntnisse in APIs. Für ein umfassendes Tutorial zur Arbeit mit APIs können Sie „So verwenden Sie Web-APIs in Python3“ nachlesen. Obwohl für Python geschrieben, hilft Ihnen der Artikel, die Kernkonzepte für die Arbeit mit APIs zu verstehen.
- Einen Texteditor, der JavaScript-Syntax-Hervorhebung unterstützt, wie Atom, Visual Studio Code oder Sublime Text. Dieses Tutorial verwendet den Kommandozeileneditor nano.
Schritt 1 — Generieren einer kodierten ID
In diesem Schritt schreiben Sie eine Funktion, um eine Kennung aus zufälligen Bytes in eine eindeutige alphanumerische Zeichenfolge zu generieren. Ihre Kennung wird unter Verwendung der Base32-Kodierung kodiert, jedoch wird sie erst später im Tutorial mit einer Prüfsumme versehen.
mkdir checksum
cd checksum
Erstellen des Projektordners und Installieren von Abhängigkeiten
Der Projektordner wird in diesem Tutorial „checksum“ genannt.
Erstellen und öffnen Sie eine package.json
-Datei in Ihrem Projektordner (mit Ihrem bevorzugten Editor):
nano package.json
Fügen Sie dann die folgenden Zeilen Code hinzu:
{
"name": "checksum",
"version": "1.0.0",
"main": "index.js",
"type": "module"
}
In dieser Datei definieren Sie den Projektnamen als checksum
und setzen die Codeversion auf „1.0.0“. Sie definieren die Haupt-JavaScript-Datei als index.js
. Wenn Sie "type": "module"
in der package.json
-Datei verwenden, sollte Ihr Quellcode die Import-Syntax verwenden. In dieser Datei verwenden Sie das JSON-Datenformat, über das Sie mehr im Artikel „Arbeiten mit JSON in JavaScript“ erfahren können.
Speichern und schließen Sie die Datei.
Sie werden einige Node.js-Module verwenden, um die ID zu generieren: crypto
und base32-encode
mit dem entsprechenden Decoder base32-decode
. Das Modul crypto
ist in Node.js enthalten, aber Sie müssen base32-encode
und base32-decode
installieren, um sie später in diesem Tutorial zu verwenden. Kodierung bedeutet, eine Zeichenfolge (Buchstaben, Zahlen, Satzzeichen und bestimmte Symbole) in ein spezialisiertes Format zu bringen, um sie effizient zu übertragen oder zu speichern. Dekodierung ist der umgekehrte Prozess: die Umwandlung eines kodierten Formats zurück in die ursprüngliche Zeichenfolge. Base32-Kodierung verwendet eine 32-Zeichen-Menge, wodurch sie eine textuelle 32-Symbol-Notation für Zahlen ist.
Installieren Sie diese Modulpakete in einer Terminalsitzung mit folgendem Befehl im Projektordner:
npm i base32-encode base32-decode
Sie erhalten eine Ausgabe, die anzeigt, dass diese Module hinzugefügt wurden:
Output
added 3 packages, and audited 5 packages in 2s
found 0 vulnerabilities
Wenn bei der Installation Probleme auftreten, können Sie die Anleitung „So verwenden Sie Node.js-Module mit npm und package.json“ zur Unterstützung konsultieren.
Code schreiben, um IDs zu generieren
Bleiben Sie in Ihrem Projektordner und erstellen Sie eine neue Datei mit dem Namen index.js
:
nano index.js
Fügen Sie die folgenden Zeilen JavaScript-Code zur index.js
-Datei hinzu:
import crypto from 'crypto';
import base32Encode from 'base32-encode';
import base32Decode from 'base32-decode';
function generate_Id(byte_size) {
const bytes = crypto.randomBytes(byte_size);
return base32Encode(bytes, 'Crockford');
}
console.log('ID for byte size = 1:', generate_Id(1), '\n');
console.log('ID for byte size = 12:', generate_Id(12), '\n');
console.log('ID for byte size = 123:', generate_Id(123), '\n');
Der Befehl import
lädt die erforderlichen Module. Um Bytes aus der Zahl zu generieren, definieren Sie eine Funktion generate_Id
, die die Byte-Größe der Bytes als Parameter nimmt und dann zufällige Bytes dieser Größe mit der Funktion randomBytes
aus dem Modul crypto
erzeugt. Die Funktion generate_Id
kodiert diese Bytes dann mit der Crockford-Implementierung der Base32-Kodierung.
Speichern Sie Ihre index.js
-Datei und führen Sie den Code in einer Terminalsitzung mit diesem Befehl aus:
node index.js
Sie erhalten eine Ausgabe ähnlich dieser:
Output
ID for byte size = 1: Y8
ID for byte size = 12: JTGSEMQH2YZFD3H35HJ0
ID for byte size = 123: QW2E2KJKM8QZ7174DDB1Q3JMEKV7328EE8T79V1KG0TEAE67DEGG1XS4AR57FPCYTS24J0ZRR3E6TKM28AM8FYZ2AZTZ55C9VVQTABE0R7QRH7QBY7V3GBYBNN5D9JK0QMD9NXSWZN95S0772DHN43Q003G0QNTPA2J3AFA3P7Q167C1VNR92Z85PCDXCMEY0M7WA
Ihre ID-Werte können aufgrund der Zufälligkeit der erzeugten Bytes abweichen. Die erzeugte ID kann je nach gewählter Byte-Größe kürzer oder länger sein.
Prüfsumme berechnen
Um die Integrität der ID zu gewährleisten, müssen Sie nun eine Prüfsumme generieren, die sicherstellt, dass die ID nicht verändert wurde. Fügen Sie die folgende Funktion am Ende Ihrer index.js
-Datei hinzu:
function calculate_checksum(bytes) {
const intValue = BigInt(`0x${bytes.toString('hex')}`);
return Number(intValue % BigInt(37));
}
Die Funktion calculate_checksum
arbeitet mit den Bytes, die zuvor in der Datei definiert wurden. Sie konvertiert die Bytes in einen Hexadezimalwert, der dann in eine Ganzzahl vom Typ BigInt
umgewandelt wird. Anschließend wird mit einer Modulo-Operation eine Zahl im Bereich von 0 bis 36 berechnet, die die Prüfsumme darstellt.
Prüfsummenzeichen abrufen
Nachdem Sie die Prüfsumme berechnet haben, ordnen Sie ihr ein Zeichen aus einer benutzerdefinierten Zeichenfolge zu. Fügen Sie diese Funktion in Ihre Datei ein:
function get_checksum_character(checksumValue) {
const alphabet = '0123456789ABCDEFGHJKMNPQRSTVWXYZ*~$=U';
return alphabet[Math.abs(checksumValue)];
}
Die Funktion get_checksum_character
verwendet die berechnete Prüfsumme, um ein Zeichen aus der konstanten Zeichenfolge alphabet
auszuwählen. Dies stellt sicher, dass jedes Prüfsummenzeichen eindeutig und leicht überprüfbar ist.
Generieren einer ID mit Prüfsumme
Kombinieren Sie die vorherigen Funktionen, um eine ID zu erstellen, die eine Prüfsumme enthält. Fügen Sie die folgende Funktion hinzu:
function generate_Id_with_checksum(bytes_size) {
const bytes = crypto.randomBytes(bytes_size);
const checksum = calculate_checksum(bytes);
const checksumChar = get_checksum_character(checksum);
const encoded = base32Encode(bytes, 'Crockford');
return encoded + checksumChar;
}
const Hotel_resource_id = generate_Id_with_checksum(132);
console.log("Hotel resource id: ", Hotel_resource_id);
Diese Funktion generiert eine ID, die aus der Base32-kodierten Zeichenfolge und dem Prüfsummenzeichen besteht. Die Kombination wird als eindeutige Kennung verwendet.
Integrität der Kennung prüfen
Fügen Sie eine Verifizierungsfunktion hinzu, um die Integrität der Kennung sicherzustellen. Diese Funktion überprüft, ob die generierte Prüfsumme mit der gespeicherten übereinstimmt:
function verify_Id(identifier) {
const value = identifier.substring(0, identifier.length - 1);
const checksum_char = identifier[identifier.length - 1];
const buffer = Buffer.from(base32Decode(value, 'Crockford'));
const calculated_checksum_char = get_checksum_character(calculate_checksum(buffer));
return calculated_checksum_char === checksum_char;
}
const isValid = verify_Id(Hotel_resource_id);
if (isValid) {
console.log("Checksum verification passed.");
} else {
console.log("Checksum verification failed.");
}
Diese Funktion dekodiert die ID, berechnet die Prüfsumme erneut und vergleicht sie mit dem Prüfsummenzeichen. Wenn die Werte übereinstimmen, wird die Integrität bestätigt.
Zusammenfassung zur Ressourcenkennung
In diesem Tutorial haben Sie eine einzigartige Ressourcenkennung erstellt, die eine Prüfsumme zur Sicherstellung der Integrität enthält. Sie haben gelernt, wie man Base32-Kodierung und Prüfsummen verwendet, um eine eindeutige ID zu generieren und zu verifizieren. Diese Techniken können in vielen Anwendungsfällen eingesetzt werden, bei denen Integrität und Eindeutigkeit entscheidend sind.