j4nk3y: Daten verschlüsseln

Salve!

Ich habe gerade einen ellenlangen Text geschrieben und dann bemerkt, das ich das erstmal selber ausprobieren sollte. Was mich zu einer anderen Frage führte, die die erstere hinfällig werden lässt, je nach Antwort.

Ich habe ein HTML document. In diesem binde ich jQuery ein und meine datei.js.
In datei.js steht dann:

$(function(){
	var daten = [];
});

Nun zur Frage (eigentlich vermute ich, dass die Antwort Ja ist, ich möchte nur absolut sicher gehen): Wenn ein User console.log(daten) in seiner Console im Browser eintippt, dann dürfte kein Ergebnis kommen, da daten nicht im Geltungsbereich liegt, richtig?

Gruß
Jo

  1. Hey,

    $(function(){
    	var daten = [];
    });
    

    Nun zur Frage (eigentlich vermute ich, dass die Antwort Ja ist, ich möchte nur absolut sicher gehen): Wenn ein User console.log(daten) in seiner Console im Browser eintippt, dann dürfte kein Ergebnis kommen, da daten nicht im Geltungsbereich liegt, richtig?

    Hättest du das nicht einfach ausprobieren können?
    Aber damit du dir absolut sicher sein kannst, verrate ich dir, dass daten nicht im globalen Scope definiert wird, die Antwort also "Ja" ist. Es wird also undefined geloggt. console('daten' in window) sollte dir ein false geben.

    Reinhard

    1. Hey,

      Hättest du das nicht einfach ausprobieren können?

      Habe ich.

      Aber damit du dir absolut sicher sein kannst, verrate ich dir, dass daten nicht im globalen Scope definiert wird, die Antwort also "Ja" ist. Es wird also undefined geloggt. console('daten' in window) sollte dir ein false geben.

      Eigentlich bin ich mir auch sicher das es so ist. Aber wäre dem nicht so dann müsste ich eine Umständliche Methode suchen, das gesamte Object zu verschlüsseln. Also Danke für die bestätigung!

      Gruß
      Jo

      P.s. Sry ich hatte vergessen den Betreff zu ändern.

  2. Tach!

    Wenn ein User console.log(daten) in seiner Console im Browser eintippt, dann dürfte kein Ergebnis kommen, da daten nicht im Geltungsbereich liegt, richtig?

    Jein. Wenn ich da einen Breakpoint innerhalb des Scopes der Variable daten setze, dann kann ich diese und alle anderen in diesem Scope anzeigen lassen. Wenn das nicht ginge, wären Debugger witzlos.

    dedlfix.

    1. Hey,

      Wenn ein User console.log(daten) in seiner Console im Browser eintippt, dann dürfte kein Ergebnis kommen, da daten nicht im Geltungsbereich liegt, richtig?

      Jein. Wenn ich da einen Breakpoint innerhalb des Scopes der Variable daten setze, dann kann ich diese und alle anderen in diesem Scope anzeigen lassen. Wenn das nicht ginge, wären Debugger witzlos.

      Aber den muss ich ja manuell setzen!? Brauchte Breakpoints noch nicht, hab da keine Ahnung.

      Gruß
      Jo

      1. Tach!

        Jein. Wenn ich da einen Breakpoint innerhalb des Scopes der Variable daten setze, dann kann ich diese und alle anderen in diesem Scope anzeigen lassen. Wenn das nicht ginge, wären Debugger witzlos.

        Aber den muss ich ja manuell setzen!? Brauchte Breakpoints noch nicht, hab da keine Ahnung.

        Ja klar, console.log() muss man auch manuell eingeben. Magst du dich mal genauer erklären, was du damit gemeint hast?

        dedlfix.

        1. Guten morgen,

          Aber den muss ich ja manuell setzen!? Brauchte Breakpoints noch nicht, hab da keine Ahnung.

          Ja klar, console.log() muss man auch manuell eingeben. Magst du dich mal genauer erklären, was du damit gemeint hast?

          Naja, da ich erstens nicht genau was ein Breakpoint macht und auch nicht wie der befehl dazu aussieht kann ich das gar nicht genau sagen. Ich tippe einfach mal in datei.js irgendwo eine zeile a la setBreakpoint();.

          Gruß
          Jo

          1. Tach!

            Naja, da ich erstens nicht genau was ein Breakpoint macht und auch nicht wie der befehl dazu aussieht kann ich das gar nicht genau sagen.

            Man sucht sich die entsprechende Ressource. Welche da vorhanden sind, inklusive Inline-Code, sieht man in einer Übersicht. Nun klickt man links von einer Zeile, irgendwo da wo die Zeilennummern stehen. Da erscheint dann ein Punkt oder Pfeil, und wenn die Abarbeitung an der Zeile angekommen ist, wird sie angehalten. Man kann nun schrittweise weitergehen und dabei immer durch Mausdraufhalten auf Variablen deren Inhalt sehen. Zudem gibt es die Konsole, mit der man innerhalb des aktuellen Scopes Anweisungen ausführen kann und weitere nützliche Untersuchungswerkzeuge.

            dedlfix.

            1. Moin,

              Man sucht sich die entsprechende Ressource. Welche da vorhanden sind, inklusive Inline-Code, sieht man in einer Übersicht. Nun klickt man links von einer Zeile, irgendwo da wo die Zeilennummern stehen. Da erscheint dann ein Punkt oder Pfeil, und wenn die Abarbeitung an der Zeile angekommen ist, wird sie angehalten. Man kann nun schrittweise weitergehen und dabei immer durch Mausdraufhalten auf Variablen deren Inhalt sehen. Zudem gibt es die Konsole, mit der man innerhalb des aktuellen Scopes Anweisungen ausführen kann und weitere nützliche Untersuchungswerkzeuge.

              Shit, dass heißt für jeden ist daten sichtbar, da er einen Breakpoint in eine Funktion setzen kann die bei z.B. Betätigung eines Buttons auslöst und sich dort daten ausgeben lassen kann. Dann kann ich an dieser Stelle aufhören weiter zu Programmieren.

              Gruß
              Jo

              1. Hallo,

                Shit, dass heißt für jeden ist daten sichtbar, …

                alles, was du an den Browser auslieferst, ist für jeden erreichbar.

                Gruß
                Jürgen

                1. Hey,

                  Shit, dass heißt für jeden ist daten sichtbar, …

                  alles, was du an den Browser auslieferst, ist für jeden erreichbar.

                  Das ist solange kein Problem, wenn der User das nicht im Klartext lesen kann, also Key : Value paare von daten.
                  Gibt es eine Möglichkeit ein komplettes Array, wenigstens die Key's, zu verschlüsseln, sodass diese für den User nicht im Klartext erreichbar sind?

                  Gruß
                  Jo

                  1. Gibt es eine Möglichkeit ein komplettes Array, wenigstens die Key's, zu verschlüsseln, sodass diese für den User nicht im Klartext erreichbar sind?

                    Wie ich es auch drehe und wende, es gibt keine Möglichkeit. Ich habe wohl Verschlüsselungsmethoden gefunden. Aber selbst da kann man ja einfach mit console.log(decrypt(daten)) (vereinfacht) daten ausgeben lassen.

                    Gruß
                    Jo

                    1. Hallo

                      Gibt es eine Möglichkeit ein komplettes Array, wenigstens die Key's, zu verschlüsseln, sodass diese für den User nicht im Klartext erreichbar sind?

                      Wie ich es auch drehe und wende, es gibt keine Möglichkeit. Ich habe wohl Verschlüsselungsmethoden gefunden. Aber selbst da kann man ja einfach mit console.log(decrypt(daten)) (vereinfacht) daten ausgeben lassen.

                      genau. Du musst den Schlüssel mitliefern. Oder willst du mit Schlüsselpaaren aus privatem und öffentlichem Schlüssel arbeiten?

                      Gruß
                      Jürgen

                      1. Hey,

                        genau. Du musst den Schlüssel mitliefern. Oder willst du mit Schlüsselpaaren aus privatem und öffentlichem Schlüssel arbeiten?

                        Das "wie" ist mir eigentlich egal, Hauptsache das "wer" ist eins, nämlich mein Javascript Code und kein User. Ich glaube das bedeutet ich muss mich in C/C++ einarbeiten und selber einen Client schreiben, und das Projekt aus dem Browser nehmen.

                        Gruß
                        Jo

                        1. Ich glaube das bedeutet ich muss mich in C/C++ einarbeiten und selber einen Client schreiben, und das Projekt aus dem Browser nehmen.

                          In C/C++ hättest du die selben Probleme. Du willst dass der Client verschlüsselte Daten verarbeitet, aber ohne dem Nutzer des Clients die Daten zu offenbaren. Damit der Client allerdings irgendetwas mit den Daten anfangen kann, muss er sie entschlüsseln. Die entschlüsselten Daten liegen irgendwann im Programmspeicher und die wird ein Angreifer auslesen können. Mit C/C++ würdest du es dem Angreifer etwas schwieriger machen, aber keinesfalls hättest du einen effektiven Schutz. Die einzig sinnvolle Lösung hatte @dedlfix dir bereits genannt: Lasse geheime Berechnungen auf dem Server ausführen. Wenn du uns noch mehr über deinen Anwendungsfall verrätst, können wir dir außerdem viel gezieltere Hilfestellung geben als es bis jetzt der Fall ist.

              2. Tach!

                Dann kann ich an dieser Stelle aufhören weiter zu Programmieren.

                Nicht unbedingt. Wenn du dein Konzept umstellen kannst, dass die geheimen Daten auf dem Server gehalten und berechnet werden und der Client nur die für ihn bestimmten Daten anzeigt, dann ist da durchaus noch eine Chance.

                dedlfix.

                1. Hey,

                  Dann kann ich an dieser Stelle aufhören weiter zu Programmieren.

                  Nicht unbedingt. Wenn du dein Konzept umstellen kannst, dass die geheimen Daten auf dem Server gehalten und berechnet werden und der Client nur die für ihn bestimmten Daten anzeigt, dann ist da durchaus noch eine Chance.

                  Ja, dass überlege ich jetzt auch schon seit Stunden aber es geht nicht da die Daten in dem Array bei jedem Client für WebGL verwendet werden, und zwingend gebraucht werden. Die Daten werden Auch falls sie sich bei einem Client relevant für alle anderen Clients ändern per Node.js bei allen Clients überschrieben. Das löschen von daten nach dem benutzen geht auch nicht, da ein Breakpoint dazwischen, daten wieder verfügbar macht... Oh Moment... ne doch nicht.

                  Hat kein Sinn. Jetzt also aus HTML/CSS/Javascript ein C/C++/OpenGl Projekt... da geht wieder ein Jahr für drauf...

                  Ich Danke euch!

                  Viele liebe Grüße
                  Jo

                  1. Moment mal. Wenn Du die Daten nutzt, um eine optische Aufbereitung zu erhalten, dann bekommt der Anwender die Daten doch zu sehen. Kannst Du denn nicht eine Vorverarbeitung machen, serverseitig, so dass für die WebGL Verarbeitung genug Informationen da sind, aber der Geheimhaltungsbedarf nicht mehr besteht?

                    Und wie schon von anderen gesagt - ein C++ Projekt hilft Dir auch nicht wirklich, es hebt die Einbruchsschwelle nur an. Du musst zusehen, dass das, was wirklich geheim sein muss, nicht auf den Client gelangt.

                    Im Zweifelsfall musst Du auf Reaktionstempo verzichten, die relevanten Berechnungsdaten, die clientspezifisch sind, in einen Ajax-Request verpacken, die Verknüpfung mit den geheimen Daten am Server machen und nur "nackige" WebGL Anweisungen zurückliefern. Weiß nicht, ob und wie das geht, es hängt alles an deinem Usecase.

                    Rolf

                    1. Hey,

                      Moment mal. Wenn Du die Daten nutzt, um eine optische Aufbereitung zu erhalten, dann bekommt der Anwender die Daten doch zu sehen.

                      Ja und Nein. Ich kann ja noch im Javascript ob ein Körper der aus den Daten generiert wird, dargestellt wird oder nicht.

                      Kannst Du denn nicht eine Vorverarbeitung machen, serverseitig, so dass für die WebGL Verarbeitung genug Informationen da sind, aber der Geheimhaltungsbedarf nicht mehr besteht?

                      Ja das tue ich. In den meisten Fällen ist das auch nicht problematisch.

                      Und wie schon von anderen gesagt - ein C++ Projekt hilft Dir auch nicht wirklich, es hebt die Einbruchsschwelle nur an. Du musst zusehen, dass das, was wirklich geheim sein muss, nicht auf den Client gelangt.

                      Ok, dann muss ich nach einer Lösung suchen.

                      Im Zweifelsfall musst Du auf Reaktionstempo verzichten, die relevanten Berechnungsdaten, die clientspezifisch sind, in einen Ajax-Request verpacken, die Verknüpfung mit den geheimen Daten am Server machen und nur "nackige" WebGL Anweisungen zurückliefern. Weiß nicht, ob und wie das geht, es hängt alles an deinem Usecase.

                      Das dürfte gehen. Eine Echo von <script> function(){} <script> und dann per jQuery einbinden. Das könnte gehen, Müsste ich aber ausprobieren.

                      Problem ist folgendes, nehmen wir dazu an, dass: Aus der Datenbank die Daten für 3 Körper kommen die 3 unterschiedlichen Usern zugeordnet sind, diese bewegen sich durch einen 3 Dimensionalen Raum mit festgelegter Geschwindigkeit und Richtungsvektor. Dies wird dann durch WebGL für jeden Client visualisiert. Weiterhin wird geprüft ob die jeweils anderen Körper sich in einem Radius des Client betreffenden Körper liegt und damit entschieden ob die jeweils anderen wirklich sichtbar sind oder ausgeblendet werden. Hierbei sind die Daten für alle 3 Körper per console.log() für jeden Client verfügbar. So plane ich es bis jetzt. Nun würde es aber einen Vorteil gegenüber den anderen Clients bedeuten wenn einer weiß, dass es die anderen Körper erstens gibt und zweitens an welchen Koordinaten sich diese befinden.

                      Dieses Problem muss ich lösen. Ich habe bereits einen Ansatz, doch diesen finde ich sehr Kompliziert. Man kann leicht durch einfache Vektorrechnung bestimmen ob und wenn wann, ein Körper im Radius eines anderen liegt und somit angezeigt werden kann. Nun müsste, wenn die erste Anfrage vom User kommt, für jeden Körper in der Datenbank einmal diese Berechnung durchlaufen und dann für jeden Körper ein PHP sleep() stattfinden bis die Daten dem Client zur Verfügung gestellt werden können. Weiterhin ist es für den User möglich Richtungsvektor und Geschwindigkeit zu ändern. Welches die Informationen von PHP wieder ändert, somit müsste dann das sleep() unterbrochen werden. Nun nutze ich mitunter Node.js, wo bei einer Richtung-/Geschwindigkeitssänderung wieder für jeden Körper berechnet werden müsste ob und wenn wann, ein Körper dargestellt werden kann. Und dann wieder per setTimout() gewartet werden muss bis die Daten zu dem entsprechende Client geschickt werden können. Dadurch könnten sich auch 2 Körper die sich vor einer änderung getroffen hätten, dann nicht mehr treffen und somit auch nicht angezeigt werden dürften. Also müsste genau dieses setTimout() gelöscht werden, ich weiß zwar wie man alle gesetzten Timouts ändert aber nicht einen spezifischen. Und ich könnte jetzt noch nicht jede Möglichkeit abschätzen wo Probleme auftreten könnten.

                      Gruß
                      Jo

                      1. Wird das eine Echtzeit-Bewegung im 3D Raum? Oder eine Schritt-für-Schritt Bewegung, wo Du nur Einzelbilder darstellst? Davon hängt ab, was Du dir leisten kannst, auf den Server zu legen.

                        Jedenfalls sind reguläre HTTP Requests und ein PHP-Sleep da nicht so der wirkliche Bringer. Deine Idee ist offenbar, den Request serverseitig warten zu lassen, bis der rechte Zeitpunkt gekommen ist und dann erst die Antwort zu senden. Das nennt man "long polling" und ist eine Technik, die zwar funktioniert, aber für deinen Zweck möglicherweise zu langsam, denn jeder Poll baut eine neue HTTP Verbindung auf. Dass "long polling" altmodisch ist, lasse ich mal ganz außer Acht. Es gibt jedenfalls was neueres und schnelleres, und die Browser unterstützen es mitterweile auch ziemlich gut.

                        Du hast ein node.js im Einsatz, schau Dir mal WebSockets oder ServerSent-Events an. Dabei wird die HTTP Verbindung nicht beendet, sondern offengehalten, und dann kann man beinahe in Echtzeit Messages in beiden Richtungen verschicken. Es gibt auch Javascript-Librarys, die Dir die eigentliche Technik kapseln. Bei uns im Unternehmen verwenden wir SignalR (leider hab ich es selbst noch nicht anprogrammiert). Das gibt's für den Brauser und für Node und stellt die bidirektionale Verbindung zwischen Server und Clients her. Ich denke, damit müsstest Du einen serverseitigen Prozess hinbekommen, der Clientübergreifend agiert und bei kollidierenden Aktionen von Client 1 ein Event bzw. eine Nachricht an Client 2 schickt.

                        Wenn Du einen zentralen Serverprozess hast, der für alle Clients die Objekte verwaltet, dann kann er im Prinzip immer dann, wenn ein Objekt für einen Client sichtbar wird, ihm eine Message schicken: "Male Körper A an Position XYZ". Und wenn ein Client seinen eigenen Körper bewegt, sendet er dem Server eine Message "Bin mit Körper K nun an Position xyz und schaue in Richtung pqr" - oder wie auch immer.

                        Wie das im Detail geht, habe ich leider noch nicht selbst erkundet. Viel Spaß beim Forschen :)

                        Rolf

                        1. Guten morgen,

                          Wenn Du einen zentralen Serverprozess hast, der für alle Clients die Objekte verwaltet, dann kann er im Prinzip immer dann, wenn ein Objekt für einen Client sichtbar wird, ihm eine Message schicken: "Male Körper A an Position XYZ". Und wenn ein Client seinen eigenen Körper bewegt, sendet er dem Server eine Message "Bin mit Körper K nun an Position xyz und schaue in Richtung pqr" - oder wie auch immer.

                          Node.js nutze ich mit Socket.io, also Websockets habe ich schon implementiert.

                          Habe mir auch seit gestern Gedanken gemacht und bin auf eine Lösung gekommen. Erst wollte ich manuell einen Cronjob programmieren, mittels new.Date() und setTimout() aber da gibt es natürlich ein Modul für Node.js welches Cronjobs schon bereit stellt. Auch schon installiert und erste Funktion geschrieben. gleich testen ob das funktioniert.

                          Und dann für jeden Körper in diesem Cronjob einfach testen ob ein Körper im "Sichtbereich" eines anderen liegt und die Daten zu dem betreffenden Client schicken. Muss mir dann noch überlegen wie ich sinnvoll die Daten beim Client lösche wenn das danach nicht mehr der Fall ist. Aber das sollte nicht so schwierig sein.

                          Ich muss mir einfach noch ein wenig Gedanken machen, welche Aufgaben ich mit dem Apache bearbeiten kann und welche zwingend über den Node-Server laufen müssen, damit jeder User die relevanten Daten erhält wenn er sie den wissen darf.

                          Danke für deine Anregungen.

                          Gruß
                          Jo

  3. Wogegen genau willst Du Dich denn schützen?

    Außer der Konsole gibt es auch das Netzwerkprotokoll, und da kann der User den Inhalt von datei.js als Teil des Response-Streams einfach anschauen.

    Rolf

    1. Guten Morgen,

      Wogegen genau willst Du Dich denn schützen?

      Vor dem auslesen von daten, da (bitte nicht über interpretieren) in daten auch Informationen von allen anderen Usern enthalten sind (natürlich keine sensiblen Account Daten oder ähnliches).

      Außer der Konsole gibt es auch das Netzwerkprotokoll, und da kann der User den Inhalt von datei.js als Teil des Response-Streams einfach anschauen.

      Der Inhalt von datei.js ist eigentlich kein Problem, nur an daten darf niemand dran kommen.

      Gruß
      Jo

      1. Wo kommt der Inhalt von daten denn her? Doch wohl über einen irgendwie gearteten WebRequest, oder? Und den kann man im Brauser belauschen. Oder per Netzwerktrace-Tool. Wenn der User den PC kontrolliert, auf dem der Browser läuft, kannst Du das nicht verhindern.

        Rolf