Entschlüsseln von Bildern mittels JavaScript im browser
Ich habe eine web-basierte Anwendung, die erfordert, dass die Bilder verschlüsselt werden, bevor Sie zum server gesendet, entschlüsselt und nach in den browser geladen vom server, wenn der richtige key war ein user.
[Edit: Das Ziel ist, dass das ursprüngliche Bild und die Schlüssel verlassen nie den computer des Benutzers so, dass er/Sie nicht erforderlich, um Vertrauen in die server.]
Mein Erster Ansatz war, der zum verschlüsseln der Bild-Pixel mit AES und lassen Sie die image-Header unberührt. Ich hatte zum speichern der verschlüsselten Bild im verlustfreien format wie png. Verlustbehaftetes format wie jpg ändern würde, die AES-verschlüsselten bits und machen Sie unmöglich entschlüsselt werden.
Nun die verschlüsselten Bilder können in den browser geladen, mit einem erwarteten vollständig verschlüsselt Aussehen. Hier habe ich ein JavaScript-code zu Lesen, in den Bilddaten als RGB-Pixel mit Image.canvas.getContext("2d").getImageData()
, erhalten Sie den Schlüssel bilden die Anwender, entschlüsseln Sie die Pixel unter Verwendung von AES, Neuzeichnen des canvas-Bereichs und zeigen Sie das entschlüsselte Bild, um den Benutzer.
Dieser Ansatz funktioniert, leidet aber zwei große Probleme.
Das erste problem ist, dass das speichern der komplett verschlüsselt Bild im verlustfreien format nimmt eine Menge von bytes, 3 bytes pro pixel.
Das zweite problem ist, dass die Entschlüsselung von großen Bildern im browser dauert eine lange Zeit.
Dies ruft der zweite Ansatz, der zur Verschlüsselung der Bild-Header anstelle der tatsächlichen Pixel. Aber ich habe nicht gefunden, einen Weg, um Lesen in der Bild-Header in JavaScript, um Sie zu entschlüsseln. Die Leinwand gibt nur die bereits dekomprimierten Pixeldaten. In der Tat, der browser zeigt das Bild mit veränderten header als ungültig.
Vorschläge zur Verbesserung der den ersten Ansatz zu machen, oder der zweite Ansatz möglich, oder bietet andere Ansätze sind sehr geschätzt.
Sorry für den langen post.
- "erfordert, dass die Bilder verschlüsselt werden, bevor Sie zum server gesendet" Frage... wie bekommt man die Bilddaten vor dem senden an den server?
- "Host-proof-hosting" ist der Begriff, den du suchst.
- Genau, danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verschlüsselt und Base64-Kodierung der Bild-roh-Daten, wenn es gespeichert wird. (Sie können nur tun, die auf einem web-browser, der die HTML5 File API, es sei denn, Sie verwenden ein Java-applet). Wenn das Bild heruntergeladen ist, unencode es, zu entschlüsseln, und erstellen Sie eine data-URI für den browser zu verwenden (oder verwende ein Java-applet, um das Bild anzuzeigen).
Kann man allerdings nicht, entfernen Sie die Notwendigkeit für die Nutzer Vertrauen in den server, da der server senden kann, was JavaScript-code, der es will, an den client senden können Sie eine Kopie des Bildes an, wenn jemand es entschlüsselt wird. Dies ist ein Anliegen, einige haben mit einer verschlüsselten e-mail-Dienst Hushmail–, dass die Regierung zwingen könnte, die Firma zu liefern, die ein schädliches Java-applet. Dies ist nicht eine Unmögliche Szenario; Telekommunikationsunternehmen Etisalat versucht abzufangen, die BlackBerry-Kommunikation durch die Installation von spyware auf dem Gerät aus (http://news.bbc.co.uk/2/hi/technology/8161190.stm).
Wenn Ihre web site ist eine von der öffentlichkeit verwendet werden, haben Sie keine Kontrolle über Ihre Benutzer, software-Konfigurationen, so dass Ihre Computer könnte sogar bereits mit spyware infiziert.
Du mich dazu inspiriert, geben diesem einen Versuch. Ich gebloggt über Sie und können Sie finden eine demo hier.
Ich verwendet Crypto-JS zum verschlüsseln und entschlüsseln mit AES und Kaninchen.
Ersten bekomme ich die CanvasPixelArray aus dem ImageData-Objekt.
Dem pixel-array hat vier bytes für die einzelnen pixel als RGBA-aber Crypto-JS verschlüsselt einen string, kein array. Zuerst habe ich verwendet .join() und .split (","), um von array zu string und wieder zurück. Es war langsam und die saite dann viel länger, als es sein musste. Tatsächlich vier mal länger. Um noch mehr Platz einsparen, habe ich beschlossen, zu entledigen, den alpha-Kanal.
String ist, was ich dann verschlüsseln. Ich sticked zu += nach dem Lesen String-Performance-Analyse.
Ich habe eine kleine 160 x 120 Pixel-Bild. Mit vier Byte für jedes Pixel, das gibt 76800 bytes. Obwohl ich zog den alpha Kanal-das verschlüsselte Bild dauert noch bis 124680 bytes 1.62 mal größer. Mit .join () - es wurde 384736 Byte, 5 mal größer. Eine Ursache, für die es noch größer als das Originalbild ist, dass Crypto-JS gibt einen Base64-kodierten string und fügt hinzu, dass so etwas wie 37%.
Bevor ich schreiben konnte, es zurück auf die Leinwand, die ich hatte, es zu konvertieren, um ein array wieder.
Entschlüsselung ist einfach.
Getestet in Firefox, Google Chrome, WebKit3.1 (Android 2.2), iOS 4.1, und eine sehr aktuelle Version von Opera.
Wollte ich etwas ähnliches machen: Auf dem server wird eine verschlüsselte gif und ich will herunterladen, entschlüsseln und anzeigen in javascript. Ich war in der Lage, um es arbeiten und die Datei auf dem server gespeichert ist, die gleiche Größe wie das original plus ein paar bytes (vielleicht bis zu 32 Byte). Dies ist der code, der führt-AES-Verschlüsselung der Datei
calendar.gif
und machtcalendar.gif.enc
, geschrieben in VB.Net.Dies ist der javascript-code, downloads
calendar.gif.enc
Binär entschlüsselt, und macht ein Bild:Vorsichtsmaßnahmen: