Hallo,
ich habe eine auf einem Server liegende verschlüsselte Datei.
Diese entschlüssel ich mit einem CryptoStream und erhalte da raus ein Byte-Array.
Nun mein Frage:
ich würde die Datei gerne öffnen ohne sie abzuspeichern, weil wozu mit verschlüsselten Datein arbeiten wenn man sie als Klartext irgendwo als Klartext abspeichert. Das arbeiten mit MemoryStreams geschieht meines Wissens nach nur auf dem Arbeitsspeicher, von daher würden auch Schattenkopien vermieden werden und der verwendete Speicher kann überschrieben werden.
Mit Bildern funktioniert das soweit, weil diese kann Image.fromBytes() ohne (mir bewusstes) zwischenspeichern Anzeigen.
Gibt es eine Möglichkeit, eine Datei dem ausführenden Programm als Bytes zu übergeben? Weil dieses würde die Datei ja auch nur Byteweise auslesen.
Mit freundlichen Grüßen
Tonix
Hi Tonix,
warum willst du eine Datei übergeben, die nicht existiert? Was du suchst, sind Streams. Da ist es egal, ob die Daten aus einem FileStream oder einem MemoryStream oder sonstwoher kommen.
Wenn im Stream Daten einer bestimmten Klasse liegen, muß die Klasse dann das Lesen von Streams unterstützen. Viele Klassen im Framework unterstützen das, Images usw. haben meist auch eine FromStream-Methode oder einen entsprechenden Konstruktor.
Letztendlich hängt es davon ab, welche Daten in den Dateien liegen sollten, aber das verrätst du ja nicht...
Christian
Weeks of programming can save you hours of planning
Ich arbeite schon mit Streams, Memory und CryptoStream
die Datein mit den ich arbeite können Videos, Bilder oder Textdokumente sein.
Sie sind im Internet aber in verschlüsselter Form
mein Anliegen ist es die Datein auf einem Client öffnen zu können ohne das sie erst auf die Festplatte kopiert werden muss
mit Process.Start kann ich nur Dateinpfade übergeben
da die datei nicht existiert gibt es auch keinen Pfad aber die Datei existiert im Arbeitsspeicher
meine überlegung ist einfach die, das ein Programm was eine Datei öffnet muss die Datei ebenfalls in Streams byteweise auslesen deshalb sollte es doch auch gehn das ich die Datei im Byteformat übergebe
ich könnte auch selbst etwas schreiben was diverse Dateiformate öffnen kann, Bilder funktionieren ja schon.
Dann wäre ich nicht Format unabhänig
Um es nochmal anders zu Formulieren
mir liegt ein Dateityp vor und ein Programm was diesen Dateityp abspielen,
die Datei wird verschlüsselt im Netz, wenn ich jetzt die Datei betrachten will müsste ich sie erst auf der festplatte speichern, damit würde die Datei eindeutig im klartext vorliegen und die "Sicherheit" wäre nicht mehr gewährleist.
Meiner Meinung aber schon wenn ich sie aus dem Arbeitsspeicher herraus öffne
Was du vorhast funktioniert nicht.
Wenn eine Datei von einem Programm geöffnet werden soll muss sie im Dateisystem sichtbar sein, diese kann natürlich auch im Arbeitsspeicher sein (Stichwort RAM-Disk, virtuelles Laufwerk), ist natürlich dann ganz normal zugreifbar.
Selbst wenn das funktionieren würde: Was willst du dagegen machen wenn jemand die Datei einfach im Programm neu speichert?
using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}
Hallo Tonix,
natürlich ist es grundsätzlich möglich, Daten von einem Programm zum anderen zu streamen, allerdings nur, wenn beide Seiten mitspielen. Wenn das Zielprogramm einen Dateinamen erwartet und das die einzige Möglichkeit ist, die es bietet, dann musst du einen Dateinamen übergeben. Daran führt kein Weg vorbei. Ganz egal, was du auf der Quellseite für tolle Streaming-Möglichkeiten implementierst.
herbivore
Wenn das Zielprogramm einen Dateinamen erwartet und das die einzige Möglichkeit ist, die es bietet, dann musst du einen Dateinamen übergeben.
das ist mir soweit klar und es ging mir darum ob ich das zielprogramm austricksen kann indem ich eine Datei sozusagen simulieren
(Stichwort RAM-Disk, virtuelles Laufwerk)
hast du dazu noch mehr infos, eventuell eine .NET-klasse? google bietet mir dazu nur fertige programm
Selbst wenn das funktionieren würde: Was willst du dagegen machen wenn jemand die Datei einfach im Programm neu speichert?
Der endnutzer bin ich und ich möchte wenn ich auf fremdsystemen arbeit trotzdem zugriff auf meine datein haben ohne sie erst abspeihern zu müssen
Schau mal hier:
Gibts für nicht kommerzielle Anwendungen umsonst.
C#-Demo:
C# File/RAM disk (COM interface)
using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}
Danke Scavanger das ist ein guter Anfang auch wenn es nicht nicht der weg ist an den ich gedacht hatte aber das wird wohl nicht gehn
hast du erfahrungen damit, speziell was die wiederherstellung der später gelöschten datein angeht?
hast du erfahrungen damit, speziell was die wiederherstellung der später gelöschten datein angeht?
Komm ich jetzt nicht mit was du meinst? Meinst du das Wiederherstellen von Daten auf einem Datenträger oder auf dem Virtuellen Laufwerk?
using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}
Mir ist Deine Mühe irgendwie ein Rätsel.
Wenn ich es richtig verstehe willst Du verhindern dass jemand an den Klartext kommt, wenn er mal Serverzugriff hat. Zuerst einmal: verhindern kannst Du es nicht.
Wenn jemand an den Klartext kommen möchte und merkt, dass Du mit .NET arbeitest kommt er schätzungsweise innerhalb 5 Minuten an den Klartext.
Du musst also abwägen, ob sich der Aufwand, der nur eine minimale Hürde gegen Zufallstreffer darstellt, sich wirklich lohnt.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Wenn ich es richtig verstehe willst Du verhindern dass jemand an den Klartext kommt, wenn er mal Serverzugriff hat
Eigentlich möchte ich nicht das jemand an den klartext kommt nur weil er zugriff auf den rechner an auf dem ich dei datei BETRACHTET habe
Wenn jemand an den Klartext kommen möchte und merkt, dass Du mit .NET arbeitest kommt er schätzungsweise innerhalb 5 Minuten an den Klartext.
Kannst du das mal genauer erklären
Man kommt jederzeit an den ILCode eines .NET Programms (zum Beispiel mit ILSpy) und kann sich quasi den kompilierten ILCode zurück in C# Code konvertieren. Das wäre mit nativen Programmiersprachen eben nicht möglich. Bei Programmiersprachen mit Zwischensprachen eben schon.
Sprich: kommt jemand an Deine Exe und will unbedingt den Klartext dann wandelt er einfach die Exe bzw. dessen ILCode zurück in C# Sourcen; ändert sein Zeugs ab und lässt sich den Klartext ausgeben.
Dein Vorgehen ist also nur sinnvoll, wenn Du was vor extremen Laien verheimlichen willst.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Da hast du meiner meinung nach nur teilweise recht
ich verschlüssel mit AES das heißt so lange der schlüssel nicht bekannt ist nützt auch der bekannte algorithmus nicht, lediglich der initialsierungsvekot ist im programm vermerkt. beim schließen des programm wird der vom programm verwendete arbeitsspeicher überschrieben bzw gelöscht
Das siehst Du falsch. Wenn Deinem Programm irgendwann der Inhalt als Klartext bekannt ist, dann kann man das auch genau an dieser Stelle ausgeben, in dem man den Quellcode der Anwendung eben manipuliert.
Das ist ja der Trugschluss an der Sache.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ok da hast du recht
dann muss ich dafür sorgen das die Integrität meines Programmes gewahrt bleibt
using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}
ok danke
das ist auf jeden fall ein punkt den man bedenken muss
es geht mir bei dem thema auch viel mehr um die theorie die dahinter steht das programm nach meinen wünschen umzusetzen
und wir schweifen etwas von dem eigentlichen thema ab
Naja ich sehs eher als erledigt an: nein, Du kannst es nicht so einfach austricksen.
Wenn es einen Dateipfad will, dann will es einen existierenden Dateipfad.
Ob das nun auf einer RAM-Disk oder irgendwo anders liegt, das ist dann wiederum Deine Sache. Die Umsetzung hier liegt ebenfalls bei Dir.
Aber eins muss Dir immer bewusst sein: wenn jemand was unbedingt will, dann kriegt er das.
Ob das nun ein Passwort, ein Lizenzkey oder irgendwann anders ist: irgendwann braucht man den Klartext und das ist ein verwundbarer Punkt, den man nicht umgehen kann.
Du schießt hier in meinen Augen mit Kanonen auf Spatzen.
Wenn das Zeugs ach so wichtig ist, wo niemand ran darf egal mit welchem Mittel, dann ist .NET der Weg, der es dem Angreifen "sehr einfach" macht.
Was Du überhaupt nicht bedacht hast: Server werden oft virtualisiert und hier werden - insbesondere, wenn die Disk des virtualisierten Servers auf einer via SAN verbundenen NAS liegt (oft aufgeteilt in LUNs) - ständig vom Host-System Schattenkopien erstellt.
Du kannst Dich drehen und winden wie Du willst. 100% wirst Du nicht erreichen.
Du musst selbst entscheiden wie viel der Aufwand wirklich wert ist, den Du (vielleicht sinnlos) investierst.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code