Ich habe eine beispielhafte clientseitige HTML-Webseite, die es einem Benutzer ermöglicht, eine Datei auf einen NodeJS-Dateispeicherserver hochzuladen. Wenn ein Benutzer eine Datei von der Webseite hochlädt, verschlüsselt der Browser des Clients die Datei mit einem Passwort, bevor er sie an den Server sendet. Der Benutzer kann die Datei dann von dieser Webseite herunterladen, indem er den hochgeladenen Dateinamen und das Passwort eingibt – der Browser lädt die Datei herunter und entschlüsselt sie. Dies geschieht mithilfe von Streams und CryptoJS, sodass ich große Dateien hoch- und herunterladen kann. (Ich hatte schon früher Erfolg mit der Verwendung von Zeichenfolgen, aber bei großen Dateien funktioniert das offensichtlich nicht.)
Ich habe es geschafft, den Verschlüsselungsprozess zum Laufen zu bringen: Ich kann eine Datei hochladen der Server, den der Browser des Clients verschlüsselt – ich kann die hochgeladene Datei auf dem Server sehen. Allerdings habe ich beim Herunterladen Probleme beim Entschlüsseln und Herunterladen der Datei. Die heruntergeladene Datei wird jedes Mal mit einer Größe von 0 Bytes und ohne Daten angezeigt.
Ich habe überprüft, dass die verschlüsselte Datei-Blob-Größe in Bytes vom Client beim Herunterladen korrekt empfangen wurde. Das Salz und die Infusion werden ebenfalls erhalten. Es scheint jedoch, dass die Variable „value“ immer undefiniert ist, wenn sie auf „wait reader.read();“ eingestellt wird – „Kein Wert erkannt“ wird protokolliert. Zu diesem Zeitpunkt bin ich mir nicht ganz sicher, wo das Problem liegt, da keine Fehler ausgegeben werden.
Ich habe unten ein kleines reproduzierbares Beispiel angehängt. Browser-Client-Code (HTML):
Ich habe eine beispielhafte clientseitige HTML-Webseite, die es einem Benutzer ermöglicht, eine Datei auf einen NodeJS-Dateispeicherserver hochzuladen. Wenn ein Benutzer eine Datei von der Webseite hochlädt, verschlüsselt der Browser des Clients die Datei mit einem Passwort, bevor er sie an den Server sendet. Der Benutzer kann die Datei dann von dieser Webseite herunterladen, indem er den hochgeladenen Dateinamen und das Passwort eingibt – der Browser lädt die Datei herunter und entschlüsselt sie. Dies geschieht mithilfe von Streams und CryptoJS, sodass ich große Dateien hoch- und herunterladen kann. (Ich hatte schon früher Erfolg mit der Verwendung von Zeichenfolgen, aber bei großen Dateien funktioniert das offensichtlich nicht.) Ich habe es geschafft, den Verschlüsselungsprozess zum Laufen zu bringen: Ich kann eine Datei hochladen der Server, den der Browser des Clients verschlüsselt – ich kann die hochgeladene Datei auf dem Server sehen. Allerdings habe ich beim Herunterladen Probleme beim Entschlüsseln und Herunterladen der Datei. Die heruntergeladene Datei wird jedes Mal mit einer Größe von 0 Bytes und ohne Daten angezeigt. Ich habe überprüft, dass die verschlüsselte Datei-Blob-Größe in Bytes vom Client beim Herunterladen korrekt empfangen wurde. Das Salz und die Infusion werden ebenfalls erhalten. Es scheint jedoch, dass die Variable „value“ immer undefiniert ist, wenn sie auf „wait reader.read();“ eingestellt wird – „Kein Wert erkannt“ wird protokolliert. Zu diesem Zeitpunkt bin ich mir nicht ganz sicher, wo das Problem liegt, da keine Fehler ausgegeben werden. Ich habe unten ein kleines reproduzierbares Beispiel angehängt. [b]Browser-Client-Code (HTML):[/b] [code]
File Upload & Download
Upload and Download Large Files
Upload File
Upload
Download File
Download
[/code] [b]Code für Client app.js:[/b] [code]// Utility: Derive AES Key from Password async function deriveKey(password, salt) { const enc = new TextEncoder(); const keyMaterial = await window.crypto.subtle.importKey( 'raw', enc.encode(password), 'PBKDF2', false, ['deriveKey'] );
// Create a Blob for the encrypted output const encryptedChunks = []; encryptedChunks.push(salt); // Store salt in the output encryptedChunks.push(iv); // Store IV in the output
let done = false;
while (!done) { const { value, done: isDone } = await reader.read(); if (value) { const encryptedChunk = await crypto.subtle.encrypt( { name: 'AES-CBC', iv: iv }, key, value ); encryptedChunks.push(new Uint8Array(encryptedChunk)); } done = isDone; }
return new Blob(encryptedChunks, { type: 'application/octet-stream' }); }
async function decryptFile(encryptedBlob, password) { // Check there is a blob to begin with if (!encryptedBlob) { throw new Error('No encrypted file provided.'); } else { console.log('Encrypted Blob size:', encryptedBlob.size); }
// Read the first 32 bytes: 16 for salt, 16 for IV const { value: header } = await reader.read(); if (!header) { throw new Error('Failed to read the file header.'); } const salt = header.slice(0, 16); // First 16 bytes are salt const iv = header.slice(16, 32); // Next 16 bytes are IV
// Start the server app.listen(PORT, () => { console.log(`Server is running at http://localhost:${PORT}`); }); [/code] Kann mir jemand helfen zu verstehen, was ich falsch mache?
Ich habe einen Java -REST -Service, der einen großen Datenstrom im Chunked Transfer -Codierungsformat sendet. In meiner Implementierung (um zu vereinfachen, generiere ich hier statische Daten)...
Ich versuche eine Protokollierungsseite mit zwei Eingangsfeldern (Benutzername und Passwort) zu machen. Ich möchte nicht, dass diese Eingabewörter sichtbar sind, wenn Sie den Quellcode im Browser...
Ich versuche eine Protokollierungsseite mit zwei Eingangsfeldern (Benutzername und Passwort) zu machen. Ich möchte nicht, dass diese Eingabewörter sichtbar sind, wenn Sie den Quellcode im Browser...