Text datei mit C# sperren?

5 Antworten

Geht nicht.

Windows selber kann sperren, aber das macht es vom Zustand (ob gerade ein Programm damit arbeitet) und den Berechtigungen abhängig.

Wenn das Programm läuft, öffnest Du die Datei und dabei ist sie (kann man einstellen) für Zugriffe gesperrt. Du kannst sie auch offen behalten, allerdings musst Du dich dann auch darum kümmern, dass Du immer die richtige Instanz (zweites Mal öffnen => Fehler) verwendest und sie auch wieder schließt, ansonsten bleibt die Datei solange gesperrt, bis Windows den Fehler bemerkt und sie wieder frei gibt.
Und das - den letzten Punkt - kannst Du nicht verhindern. Programm aus = früher oder später ist die Datei frei.

Was aber geht ist Verschlüsselung.
Wenn Du die Datei verschlüsselst, dann kann sie niemand bearbeiten, ohne den Schlüssel zu kennen.

Oder Du verwendest eine Datenbank, die ist für einen Laien schwerer zu bearbeiten als z.B. JSON. Datenbanken unterstützen normalerweise auch einen Passwort-Schutz.

Beides (Verschlüsselung und Datenbank mit Passwort) hat aber das Problem, dass der Schlüssel bzw. das Passwort irgendwo stehen muss. Und das ist dann der Punkt, wo dein letzter Satz greift, denn ab da wird es unmöglich, einen wirklich echten Schutz zu gewährleisten.

Ich weiß nicht, wie es große Spiele machen, aber da deren Daten deutlich komplexer sind, tippe ich mal auf eine Datenbank, die mit irgendeinem hardcoded Passwort gesichert ist. Sicher ist das nicht, aber es fängt den Großteil der Möchtegern-Cheater/Hacker ab.

Woher ich das weiß:Berufserfahrung – C#.NET Senior Softwareentwickler

Zum verschlüsseln mit Key und Salt [SHA2] habe ich zwei Funktionen .Net fähig gemacht aber es ist in Visual Basic, Du müsstet also den Quelltext nur in C# übersetzen.

Die Funktion erwartet die angegebenen Parameter und ist denkbar einfach verwendbar.

Der verschlüsselte Ciphertext kann nicht gelesen werden. Hier die zwei Funktionen, leider steht mir C# nicht zur Verfügung und habe auch keine Lust das mir dieser Beta-Win Pro 10 zu machen.

 Public Function Encrypt(ByVal plainText As String, ByVal passPhrase As String, ByVal saltValue As String, ByVal hashAlgorithm As String, ByVal passwordIterations As Integer, ByVal initVector As String, ByVal keySize As Integer) As String

        Dim initVectorBytes As Byte()
        initVectorBytes = Encoding.ASCII.GetBytes(initVector)

        Dim saltValueBytes As Byte()
        saltValueBytes = Encoding.ASCII.GetBytes(saltValue)

        Dim plainTextBytes As Byte()
        plainTextBytes = Encoding.UTF8.GetBytes(plainText)

        Dim password As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(passPhrase, saltValueBytes, passwordIterations)
        Dim keyBytes As Byte()
        keyBytes = password.GetBytes(CInt(keySize / 8))

        Dim symmetricKey As RijndaelManaged
        symmetricKey = New RijndaelManaged()
        symmetricKey.Mode = CipherMode.CBC

        Dim encryptor As ICryptoTransform
        encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes)

        Dim memoryStream As MemoryStream
        memoryStream = New MemoryStream()

        Dim cryptoStream As CryptoStream
        cryptoStream = New CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)
        cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length)
        cryptoStream.FlushFinalBlock()

        Dim cipherTextBytes As Byte()
        cipherTextBytes = memoryStream.ToArray()
        memoryStream.Close()
        cryptoStream.Close()

        Dim cipherText As String
        cipherText = Convert.ToBase64String(cipherTextBytes)
        Encrypt = cipherText

    End Function

    Public Function Decrypt(ByVal cipherText As String, ByVal passPhrase As String, ByVal saltValue As String, ByVal hashAlgorithm As String, ByVal passwordIterations As Integer, ByVal initVector As String, ByVal keySize As Integer) As String

        On Error Resume Next

        Dim initVectorBytes As Byte()
        initVectorBytes = Encoding.ASCII.GetBytes(initVector)

        Dim saltValueBytes As Byte()
        saltValueBytes = Encoding.ASCII.GetBytes(saltValue)

        Dim cipherTextBytes As Byte()
        cipherTextBytes = Convert.FromBase64String(cipherText)

        Dim password As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(passPhrase, saltValueBytes, passwordIterations)
        Dim keyBytes As Byte()
        keyBytes = password.GetBytes(CInt(keySize / 8))

        Dim symmetricKey As RijndaelManaged
        symmetricKey = New RijndaelManaged()
        symmetricKey.Mode = CipherMode.CBC

        Dim decryptor As ICryptoTransform
        decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes)

        Dim memoryStream As MemoryStream
        memoryStream = New MemoryStream(cipherTextBytes)

        Dim cryptoStream As CryptoStream
        cryptoStream = New CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)

        Dim plainTextBytes As Byte()
        ReDim plainTextBytes(cipherTextBytes.Length)

        Dim decryptedByteCount As Integer
        decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length)

        memoryStream.Close()
        cryptoStream.Close()

        Dim plainText As String
        plainText = Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount)

        Decrypt = plainText
    End Function


Woher ich das weiß:Hobby

Palladin007  29.01.2022, 16:23
keine Lust das mir dieser Beta-Win Pro 10 zu machen.

"Beta-Win Pro 10"?

0
geri3d  29.01.2022, 20:46
@Palladin007

Windows 7 hatte diese ständigen Verbesserungen nicht, aber es tut sich was.

Offensichtlich ist mein Windows anders aber ich bin Top zufrieden damit und will auf keinen Fall auf dieser Maschine 11 drauf haben und ich habe die Befürchtung, dass mein gutes altes Office 2007 und VS2008 dann nicht meht funktioniert und die Neuerungen in VS interessieren mich nicht.

Big Brother is waching me.

0
Palladin007  29.01.2022, 20:55
@geri3d

Ich glaube, Du hast deinen Beruf als IT-Berater verfehlt :D

Die meisten Firmen, die so gedacht haben, sind damit früher oder später massiv gegen die Wand gefahren und einige kratzen sich vermutlich immer noch davon los...

1
pcjobnet  29.06.2022, 08:17
@geri3d

Big Brother watched auch im Windows 7, aber wenn du immer noch W7 einsetzt, dann hast du vorallem auch keine Security Updates mehr drauf und das ist gefährlich.
Ausserdem, auch mit den Änderungen, die einem vielleicht nicht gefallen, du verpasst sehr viel Innovation, wenn du auf derart alte Software setzt.

0

@DerEinsiedler hat schon mal vorgelegt.

naja ... readonly ist natürlich nur insoweit nützlich, bis der Cheater die Dateiattribute ändert.😏🥱

Etwas sicherer wäre es, wenn man die save-Datei unsichtbar macht. (ich würde fieserweise noch ein Dublikat der Datei sichtbar speichern, jedoch nur die unsichtbare Datei wieder einlesen. Dann kann der Cheater die sichtbare Savedatei ändern bis er schwarz wird. )

Statt des Hiddenattributes:

Eine ganz schräge Nummer wäre die Verwendung von ADS . Dann kann niemand ein Save per USB-Stick oder Up-/Download weitergeben, denn ADS funktionieren nur mit NTFS. ...und natürlich wissen die normalen Nutzer nichts von diesen "Dateianhängen" Bein Kopiern auf "nichtNTFS" wird nur der Inhalt der Datei weitergegeben, welche den ADS "trägt", ...aber nicht der ADS selbst

Hier ein kleine Batch, welche ein Geheimnis an eine normale Textdatei anhängt.

@echo off
echo Das ist in der datei sichtbar >"test.txt"
echo "Geheimer Text" > "test.txt:geheim.txt"

for /f "usebackq tokens=*" %%a in ("test.txt:geheim.txt") do echo %%a
 rem öffne die Datei normal im Editor
start "" notepad "test.txt"
 rem dito für den stream
start "" notepad "test.txt:geheim.txt"
pause

Im Explorer wirst du nix davon zu sehen bekommen und selbst der Gute alte Dir-Befehl gibt nicht ohne weiteres das Geheimnis preis.

dir test.txt

Selbst eingefleischte Administratoren denken nicht an:

dir /r

Palladin007  29.01.2022, 16:15
Etwas sicherer wäre es, wenn man die save-Datei unsichtbar macht.

Naja - bei mir ist immer alles auf sichtbar gestellt und schwer ist das auch nicht :D

Eine ganz schräge Nummer wäre die Verwendung von  ADS .

Das klingt allerdings echt fies, das kannte ich auch noch nicht - danke für die Lehrstunde.

Gleich mal suchen, wo solche Streams alles dran hängen :D

1
Erzesel  29.01.2022, 16:29
@Palladin007

mal das ganze Lw C: durkämmen:

dir /r /s C:\*.* |find "$DATA"

ADS sind garnicht so selten. irgendwo muss Windows ja erweiterten Informationen zu Dateien unterbringen (Eingenschaften>Details-tab)

1
Palladin007  29.01.2022, 16:34
@Erzesel
ADS sind garnicht so selten. irgendwo muss Windows ja erweiterten Informationen zu Dateien unterbringen

Die Frage hatte ich mir auch schon gestellt, schön dass sie jetzt beantwortet ist ^^

Vielleicht kann ich das auch für ein aktuelles Projekt nutzen, denn da muss ich (leider) das Passwort für eine Datenbank als Datei abspeichern. Es ist verschlüsselt, aber bei jeder Verschlüsselung bleibt die Frage: Wo steht der Key?

So könnte ich die Datei nochmal zusätzlich verbergen.
Ich muss nur klären, was passiert, wenn ich die Datei kopiere/verschiebe/lösche/umbenenne - hoffentlich das, was man erwartet ^^

0
Erzesel  29.01.2022, 16:57
@Palladin007

Auf Datenträgern ohne NTFS geht der ADS verloren, ansonsten geht alles mit der Datei mit und wird auch kopiert.

Eigentlich ist es schwerer einen ADS wieder los zu werden ohne die Datei zu löschen. Einen ans Rootverzeichnis eines Laufwerks angehängten wirst extrem schwer wieder los. Mit Bordmitteln hilft eigentlich nur formatieren. https://docs.microsoft.com/en-us/sysinternals/downloads/streams hab ich noch nicht getestet... Vielleicht mal, wenn ich ein Lw platt mache?

Hier eine kleine Abhandlung dazu:

https://www.bleepingcomputer.com/tutorials/windows-alternate-data-streams/

1
pcjobnet  29.06.2022, 08:18

Nette Ansichten, aber ich würde auf keinen Fall das über irgendwelche Dateiattribute und dergleichen lösen. Das ist eine Frage der Verschlüsselung und sonst nichts. Alles andere ist Spielerei.

0
Erzesel  29.06.2022, 09:23
@pcjobnet

guckmal aufs Datum... die Nummer ist längst abgegessen...😏

Sowas sind Planspiele... billige Lösungen für Anfänger...

Natürlich ist Verschlüsselung die beste Lösung, aber man darf ja wohl auch mal mit etwas "schrägen" Alternativen "herumspielen".

Du würdest staunen, wie viele Programmierer es gibt, welche noch nie von den ADS gehört haben..

0
pcjobnet  29.06.2022, 09:38
@Erzesel

Das ist schon so. Ausserdem, nur weil etwas einen Moment her ist, heisst das nicht, dass die Nummer schon durch ist.

Der Punkt ist... wenn es um Sicherheit geht, dann empfehlen sich gängige Vorgehensweisen und nicht "ich finde eine eigene coole Lösung, die funktioniert, solange niemand weiss, wie es gemacht wird". Sicherheit ist dann gewährleistest, wenn du alles offenlegen kannst ausser dem Schlüssel...

0

Wie schon erwähnt, brauchst du lediglich eine Verschlüsselungsroutine. Schwierig ist nur die Ablage des entsprechenden Schlüssels (oder der passphrase bei gerid3d), die muss ja auch irgendwo im Programm hinterlegt sein.

Hier noch ein aktueller Link zum Thema Verschlüsselung und so zum Einsteigen in die Thematik.

Verschlüsseln von Daten | Microsoft Docs


Erzesel  29.06.2022, 10:12

Auch wenn der Thread schon Schnee von gestern ist...

Schwierig ist nur die Ablage des entsprechenden Schlüssels ..., die muss ja auch irgendwo im Programm hinterlegt sein.

nö muss sie nicht...

Den Schlüssel kannst Du zufällig generieren. und beispielsweise die einzelnen Bytes des Keys unter die veschlüsselten Daten mischst (Multiplexing? Scrambling?) oder mit diesen XOR verknüpfst . Du kannst sogar für jeden Speichervorgang einen neuen Schlüssel generieren und unter die Bytes des verschlüsselten Bytearrays (Daten) mischen. Der Fantasie sind dabei keine Grenzen gesetzt...

In C# wird es etwas schwieriger eine entsprechende Scramblingfunktion zu verbergen, aber es ist machbar. ...und da wären wir wieder beim "Versteckspiel" (die Nummer Obfuscation, Antidebugger, Antidisassembler ist so alt wie die Geschichte der Computerprogrammierung)

...allerdings ist wäre sowas zum geschützten Abspeichern von Spielständen wohl eher "Kanonen auf Spatzen"

1

https://dotnet-snippets.de/snippet/schreibschutz-einer-datei-setzen-entfernen/452

Alternativ: schreib keinen Text in die Datei, sondern serialisiere dein(e) Objekte da rein.


Elias489 
Fragesteller
 29.01.2022, 16:03

Wie meist du das mit dem Serialisieren? Den bei bei der Website die du dazu gesendet hast verstehe ich gar nichts 😅

0