# Visual Basic 2008 Verschlüsselung - Sicherheit?



## Koyote (16. März 2012)

*Visual Basic 2008 Verschlüsselung - Sicherheit?*

Guten Tag,

ich arbeite zur Zeit an einer Methode eine sichere Passwortabfrage zu erstellen.
Ich habe mir dann folgendes überlegt:

Ein Zahlencode ist gespeichert. In das Textfeld gibt man das Passwort ein, z.B. Haus und dann wird jeder Buchstabe verschlüsselt, also a= 1, b=2 usw. nur halt nicht mit 1,2,3 usw. 

Soweit so gut funktioniert es auch. Ich lade beim Klick auf Login jedes Zeichen in eine Variable und lasse es dann durch eine funktion umformen. Der umgeforme Wert kommt in eine neue Variable. Insgesamt also 20Variablen für die Eingabe und das umgeformte.
Am Ende wird dann alles in einer Variable zusammengetragen, also Variable eingegebenespasswort = umgeformtes zeichen 1, umgeformtes zeichen 2 usw...

Diese Variable, in der alles zusammengetragen ist, wird dann mit der Variable mit dem Code verglichen und dann wird je nach ergebnis eben der login als erfolgreich oder fehlgeschlagen erklärt.

Meine Frage wäre jetzt: Ist das überhaupt sicherer als eine einfache If-Abfrage? Können nich andere einfach die Werte von außen auslesen? Gibt es eine Bessere Methode? Was ist daran schlecht usw..

Hier mal Codeausschnitte :

Die Deklarierung:

```
'originale Zeichen
    Dim zeichen1 As String
    Dim zeichen2 As String
    Dim zeichen3 As String
    Dim zeichen4 As String
    Dim zeichen5 As String
    Dim zeichen6 As String
    Dim zeichen7 As String
    Dim zeichen8 As String
    Dim zeichen9 As String
    Dim zeichen10 As String
    'convertierte Zeichen
    Dim czeichen1 As String
    Dim czeichen2 As String
    Dim czeichen3 As String
    Dim czeichen4 As String
    Dim czeichen5 As String
    Dim czeichen6 As String
    Dim czeichen7 As String
    Dim czeichen8 As String
    Dim czeichen9 As String
    Dim czeichen10 As String
    'Funktion Convertieren
    Dim variable As String
    Dim cvariable As String
```

Die festsetzung des Passworts

```
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        
passwort = "123"
```


Einlesen der Zeichen usw. :

```
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Zeichen einlesen
        Try
            zeichen1 = TextBox2.Text(0)
            zeichen2 = TextBox2.Text(1)
            zeichen3 = TextBox2.Text(2)
            zeichen4 = TextBox2.Text(3)
            zeichen5 = TextBox2.Text(4)
            zeichen6 = TextBox2.Text(5)
            zeichen7 = TextBox2.Text(6)
            zeichen8 = TextBox2.Text(7)
            zeichen9 = TextBox2.Text(8)
            zeichen10 = TextBox2.Text(9)
        Catch
            MsgBox("Fehlerhafter Benutzername oder Passwort", MsgBoxStyle.Critical, "Achtung!")
        End Try
        'Zeichen convertieren
        czeichen1 = Convertieren(zeichen1)
        czeichen2 = Convertieren(zeichen2)
        czeichen3 = Convertieren(zeichen3)
        czeichen4 = Convertieren(zeichen4)
        czeichen5 = Convertieren(zeichen5)
        czeichen6 = Convertieren(zeichen6)
        czeichen7 = Convertieren(zeichen7)
        czeichen8 = Convertieren(zeichen8)
        czeichen9 = Convertieren(zeichen9)
        czeichen10 = Convertieren(zeichen10)
        'Passwort abfragen
        If czeichen1 + czeichen2 + czeichen3 + czeichen4 + czeichen5 + czeichen6 + czeichen7 + czeichen8 + czeichen9 + czeichen10 = passwort And txtbox_login.Text = login Then
            Form2.Show()
        Else : MsgBox("Fehlerhafter Benutzername oder Passwort", MsgBoxStyle.Critical, "Achtung!")
            schreiben.Close()
        End If
    End Sub
```

Die Funktion


```
Public Function Convertieren(ByVal zeichen As String) As String
        Select Case zeichen
            'Großbuchstaben
            Case "A"
                Return "1"
            Case "B"
                Return "2"
            Case "C"
                Return "3"
```


Natürlich habe ich A-Z, a-z und 0-9 auch noch 

Würde mich über Antworten freuen.


----------



## Crymes (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Ich sag es nach meinem Kenntnisstand ma so: Strings können aus einer .exe ausgelesen werden, hab ich selber mit meinen eigenen Programmen gemacht (gibts so ne Freeware, die die .exe in ne Art assembler umwandelt).
Deshalb ist es (meiner Meinung nach) Besser, wenn du einen eigenen Verschlüsselungsalgorythmus ohne feste Strings oder chars implementierst.

PS: Jetzt weiss ich endlich, wie man Zeichen für Zeichen einließt, was ist das eigentlich für ne Sprache? VB.NET?

Grüße, Crymes.


----------



## Koyote (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Danke für deine Hilfe, kannst du deinen Verbesserungsvorschlag noch einmal weiter erklären? Werde noch nicht ganz schlau daraus.


PS: Beim zeichen einlesen darauf achten, dass das erste Zeichen 0 ist und nicht 1.


----------



## fadade (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Also für den Anfang ist das gar nicht schlecht! probier es erstmal so, optimiere es ein wenig und dann hast du eine schöne Cäsar-Verschlüsselung ^^
Problem dabei ist nur: Gib mir das Prog und ich kann dir innerhalb von 1Min das PW sagen 
Das liegt nichtmal an der If-Sache, sondern an .NET allgemein. Das kann man sehr einfach knacken ... also "sicheren" .NET-Code bekommst du nur wenn du deine exe verschlüsselst, aber jetzt mal davon ausgegangen, dass der "Anwendern" ungleich _fadade (o.ä.)_ ist, kannst du das machen wie du möchtest; man hat ja als normaluser nur die GUI vor sich.

Als Tipp jetzt noch: Vielleicht solltest du den Input-Text nur als EINEN String speichern und die Operation dann einfach auf den entsprechenden Index anwenden, dann hast du da nich so ein 1,2,3,4,5,6.... Gewurschtel 

*was ist daran schlecht*(wobei schlecht jetzt nicht beleidigend sein soll xD) du behandelst gerade jeden Wert separat--> Aufwendig .... du hast alle Daten unverschlüsselt im RAM liegen ..... Cäsar-Verschlüsselung allgemein ist so sicher, wie wenn du ein Paket hast und darauf schreibst "Nicht öffnen!"  ..... 
Bessere Methoden wenn es um Verschlüsselung geht gibt es im Inet (ähnliches Prinzip, aber dennoch einfach zu realisieren: Vigeniere-Verschlüsselung, oder du fängst an komplexe Primzahlwerte aus der Eingabe zu berechnen etc. etc. aber das wird dann auch seeeehr komplex!).
Aber wie gesagt, wenn du erstmal nur eine PW-Abfrage haben möchtest, dann würde auch reichen: 

```
If "[PASSWORT]" == Textbox1.Text //oder wie man das in VB macht
   // Akzeptieren
```

Edit: wie Crymes schon geschrieben hat Literale sind keine soooo gute Idee, aber wenn man erstmal nur die Funktion haben möchte, dann kannst du es so machen


----------



## Crymes (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Du wolltest mit der if Abfrage Das Passwort mit nem gespeicherten Stríng oder anderen festen Variablen vergleichen oder?
Die können meines Achtens ausgelesen werden, sodass du die mindestens durch einen Algorythmus umwandeln solltest, weil Anweisungen aus einem Programm sehr schwer auszulesen sind.


----------



## Koyote (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Also eine einfache If-Abfrage ist ja das Ende vom lied : 


```
If czeichen1 + czeichen2 + czeichen3 + czeichen4 + czeichen5 + czeichen6 + czeichen7 + czeichen8 + czeichen9 + czeichen10 = passwort And txtbox_login.Text = login Then             Form2.Show()
```

Ist halt nur unsicher  


Das mit weniger Variablen kann ich nacher mal machen. Wie ich das allerdings mit der genantnen Caesar verschlüsselung so hinbekommen kann, dass man es nicht mehr auslesen kann ist mir rätselhaft. Weil wenn man meins auslesen kann, kann ich mir auch das umwandeln sparen


----------



## bingo88 (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Ja, das sieht mir nach VB .NET aus.

Zum Thema: Mir sieht das im Moment so aus, als machst du eine einfache feste Zuordnung der Form "Buchstabe x = Zahl y". Wenn dem so ist, brauch man nicht mal die Exe öffnen und nach irgendwelchen String-Ersetzungen suchen, man gibt etwas ein und guckt was rauskommt. Sicher wäre das also nicht.


----------



## Crymes (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Mir würde spontan einfallen, dass du dir in C++ eine Dll mit der Funktion schreibst und die dann mit .Net aufrufst.
Ich würde mir als Verschlüsselung mit den zugewiesenen int Werten des Passworts eine zahl ausrechnen und die dann mit der in der Dll vergleichen.
Ich hab keine spezielle Ahnung von Verschlüsselungsverfahren, aber vieleicht könnte man beide Werte mal die aktuelle Uhrzeit nehmen, um das RAM Problem zu lösen.


----------



## Koyote (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Jop, ist VB.Net, programmiere in Visual Basic express 2008 von Visual Studio.

Ja genau das ist mein Problem, wo kann ich denn die Gegenwerte sicher speichern? irgentwo muss ja ein gegenwert vorliegen, den ich auch kennen muss.


EDIT:

Habe jetzt anstatt czeichen1, czeichen2, czeichen3, czeichen4, czeichen5, czeichen6, czeichen7, czeichen8, czeichen9, czeichen10
Nur noch czeichen. Die Funktion ist gleich geblieben, nur bei der Abfrage habe ich etwas verändert : Alle zeichen werden konvertiert und in eine variable geschrieben. Die einzelnen zeichen Variablen habe ich aber trotzdem noch 


```
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Zeichen einlesen
        Try
            zeichen1 = TextBox2.Text(0)
            zeichen2 = TextBox2.Text(1)
            zeichen3 = TextBox2.Text(2)
            zeichen4 = TextBox2.Text(3)
            zeichen5 = TextBox2.Text(4)
            zeichen6 = TextBox2.Text(5)
            zeichen7 = TextBox2.Text(6)
            zeichen8 = TextBox2.Text(7)
            zeichen9 = TextBox2.Text(8)
            zeichen10 = TextBox2.Text(9)
        Catch
            MsgBox("Fehlerhafter Benutzername oder Passwort", MsgBoxStyle.Critical, "Achtung!")
        End Try
        'Zeichen convertieren
        czeichen = Convertieren(zeichen1) & Convertieren(zeichen2) & Convertieren(zeichen3) & Convertieren(zeichen4) & Convertieren(zeichen5) & Convertieren(zeichen6) & Convertieren(zeichen7) & Convertieren(zeichen8) & Convertieren(zeichen9) & Convertieren(zeichen10)
        'Passwort abfragen
        If czeichen = passwort And txtbox_login.Text = login Then
            schreiben.Write("Uhrzeit: " & lbl_Zeit.Text & vbCrLf & "IP: " & lbl_ip.Text & vbCrLf & "Login: Erfolgreich" & vbCrLf & "_____________________" & vbCrLf)
            schreiben.Close()
            Form2.Show()
        Else : MsgBox("Fehlerhafter Benutzername oder Passwort", MsgBoxStyle.Critical, "Achtung!")
            schreiben.Write("Uhrzeit: " & lbl_Zeit.Text & vbCrLf & "IP: " & lbl_ip.Text & vbCrLf & "Login: Fehlgeschlagen" & vbCrLf & "_____________________" & vbCrLf)
            schreiben.Close()
        End If
    End Sub
```


----------



## fadade (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*



bingo88 schrieb:


> Ja, das sieht mir nach VB .NET aus.
> 
> Zum Thema: Mir sieht das im Moment so aus, als machst du eine einfache feste Zuordnung der Form "Buchstabe x = Zahl y". Wenn dem so ist, brauch man nicht mal die Exe öffnen und nach irgendwelchen String-Ersetzungen suchen, man gibt etwas ein und guckt was rauskommt. Sicher wäre das also nicht.


 
Also ich hab das so verstanden, dass die Ausgabe gar nicht angezeigt wird, sprich du kannst dir nicht einfach ansehen, was rauskommt. Dann hätte man ja echt einfach paar Eingaben ausgewertet und siehe da Caesar rückverschlüsseln geht so und so ...

@TE: 
Das mit dem sicheren Speichern ist so eine Sache. Du kannst eben nur sehr wenig "sicher" speichern. Deswegen basiert sowas schon oftmals auf berechnungen, die eben nciht einfach ausgelesen werden können. Aber so tief in der computerkryptografie bin ich auch nicht drin


----------



## Koyote (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*



> Also ich hab das so verstanden, dass die Ausgabe gar nicht angezeigt wird



Ist richtig so.

Es gibt also keine sichere Variante?


----------



## fadade (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Nicht 100% und vor allem nicht für Anfänger/Fortgeschrittene mal eben so zu machen


----------



## bingo88 (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Ist das eine übungsaufgabe, sprich musst du caesar einseetzen? Und warum willst du das pw fest kodieren? Lass es den benutzer doch zu beginn eingeben und dann wird das verschlüsselt gespeichert. Dazu nimmst du am besten eine hashfunktion (sha1 zb). Eine hashfunktion ist eine sog. Einwegfunktion. Der verschlüsselte text lässt sich nicht wieder entschlüsseln - zumindest ist das das ziel. Md5 ist bspw. nicht mehr sicher, zumindest reiner md5. Wenn der user das pw erneut eingibt, vergleichst du den hash mit dem gespeicherten. Stimmen die überein, dann ist das pw ok.


----------



## Koyote (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Guten Abend  Ich zertile mal deinen post (Bingo) um ihn besser beantworten zu können 



> Ist das eine übungsaufgabe, sprich musst du caesar einseetzen?


Übungsaufgabe? Du meinst von Schule o.Ä.? Nein, ich programmiere das Privat für mich. Das ist ja nur das Login Fenster, welches dann zu einer weiteren Form führt.



> Und warum willst du das pw fest kodieren? Lass es den benutzer doch zu beginn eingeben


Weil ich das Programm nur für mich benutze. Da dachte ich, dass ein Passwort leichter ist als ein veränderbares. 




> und dann wird das verschlüsselt gespeichert


Wie und wo gespeichert?


Das mit dem Hash hört sich ja ganz gut an, aber wo wird der berechnet? Ist das nicht auch irgentwie dann auslesbar?

EDIT:

HASH umwandlung geschrieben (20 Minuten gebraucht für die paar zeilen, musste einiges im Buch nachschlagen) 
Wo soll ich den Hash denn speichern? Und ohne nen Multiplikator beim ToString kann doch jeder sich den hash, wenn er das gleiche Programm macht wie ich auch holen, oder? 



```
Public Function MD5F(ByVal Inhalt As String) As String
        Dim MD5 As New System.Security.Cryptography.MD5CryptoServiceProvider
        Dim Bytecode() As Byte = System.Text.Encoding.ASCII.GetBytes(Inhalt)
        Bytecode = MD5.ComputeHash(Bytecode)
        Dim HASH As String = 0
        For Each bt As Byte In Bytecode
            HASH &= bt.ToString 'Geheim
        Next
        Return HASH
    End Function
```


----------



## bingo88 (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Du könntest natürlich ein Programm schreiben, das dir einfach einen Hash zu einem PW berechnet. Diesen Hash nutzt du dann anstelle deines Klartextpasswords:

```
Dim passwd As String = "<hash>"
```

So ist das PW nicht im Klartext vorhanden. Du musst das eingegebene PW dann vor dem Vergleichen natürlich ebenfalls hashen. Dann kannst du beide Strings einfach auf Gleichheit testen.

Zum Speichern: Du kannst das PW in einer Datei ablegen oder in der Windows Registry z. B. (also den Hashwert natürlich ^^)


----------



## Koyote (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Das wäre doch dann das, was in meinem post oben steht, oder nicht? Post #14


----------



## bingo88 (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Ja genau. MD5 ist zumindest besser als ein Klartextpassword


----------



## Koyote (16. März 2012)

Schau mal meine frage aus dem post bitte noch an.


----------



## bingo88 (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Meinst du "Wo soll ich den Hash speichern?":

Du erzeugst dir erst mal einen Hashwert für dein Passwort (ruf dazu die methode auf und kopiere den Ergebnisstring). Dieses Ergebnisstring setzt du dann als Passwort-Variable in deinem Programm (was du ganz am anfang mit passwort = "123" gemacht hast - ersetze "123" durch den Hashstring).


----------



## Koyote (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Ist da eine Variable wirklich das passende? Wie könnte ich denn den Hash noch ein bisschen verstecken? Denn eine Variable wurde ja gesagt, wird ganz schnell ausgelesen...


Ich meinte eher die Frage :



> Und ohne nen Multiplikator beim ToString kann doch jeder sich den hash,  wenn er das gleiche Programm macht wie ich auch holen, oder?



Weil wenn jemand den Hash hat, kann es sich doch auch einfach ein Programm programmieren, das mit der gleichen methode wie meins funktioniert?


----------



## bingo88 (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Nein, du kannst aus einem Hashwert nicht den Ursprungstext ermitteln. Das hängt aber vom Hashverfahren ab. Reines MD5 gilt zwar nicht mehr als sicher, aber für dein Problem wird es reichen.

Um den Ablauf noch mal klar zu machen:
Passwort Hash einmalig(!) erzeugen. Diesen Hash kopierst du in in die Variable (fest codiert). Danach brauchst du kein Klartextpasswort mehr im Code! Du gibst dann dein PW ein, erzeugt mittels der Methode den Hash (der hängt ja von der Eingabe ab - kennt der Anwender das PW nicht, kommt auch nicht der richtige Hashwert raus!) und vergleichst diesen mit dem hinterlegten Hash.


----------



## Koyote (16. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Man kann also vom Hashcode nicht zurück auf den normalen Zeichencode kommen? Habe jetzt das ganze mit dem Password Feld geschafft, kann ja noch Benutzername einbauen.

Hier das ganze nochmal zur kontrolle.


```
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Passwort
        Dim password As String
        password = "HASHCODE"
        If MD5F(txtbox_pw.Text) = password Then
            schreiben.Write("Uhrzeit: " & lbl_Zeit.Text & vbCrLf & "IP: " & lbl_ip.Text & vbCrLf & "Login: Erfolgreich" & vbCrLf & "_____________________" & vbCrLf)
            schreiben.Close()
            Form2.Show()
        Else : MsgBox("Fehlerhafter Benutzername oder Passwort", MsgBoxStyle.Critical, "Achtung!")
            schreiben.Write("Uhrzeit: " & lbl_Zeit.Text & vbCrLf & "IP: " & lbl_ip.Text & vbCrLf & "Login: Fehlgeschlagen" & vbCrLf & "_____________________" & vbCrLf)
            schreiben.Close()
        End If
    End Sub
    Public Function MD5F(ByVal Inhalt As String) As String
        Dim MD5 As New System.Security.Cryptography.MD5CryptoServiceProvider
        Dim Bytecode() As Byte = System.Text.Encoding.ASCII.GetBytes(Inhalt)
        Bytecode = MD5.ComputeHash(Bytecode)
        Dim HASH As String = 0
        For Each bt As Byte In Bytecode
            HASH &= bt.ToString
        Next
        Return HASH
    End Function
End Class
```
Als erstes wird eine Variable password als String delklariert. Dann wird der vorher mit meinem Hascode-generator generierte HASHCODE in die Variable geladen. Der Hashcode wird nicht während des programms noch ausgerechnet.

Dann kommt eine If abfrage:
Wenn die Funktion MD5F mit der textbox des passwortes den gleichen Wert zurückgibt wie die Variable password ihn hat, dann ist der login erfolgreich. Wenn nicht, dann ist er nicht erfolgreich.

In der Funktion kann ein hashcode generiert werden. Die Funktion wird wie eben erklärt aufgerufen, wenn der button gedrückt wird. Der Hashcode wird dann vom Passwort (das ganz normal eingeben wurde) gemacht.


EDIT: Soll ich es beim Login Name auch so machen? Weil da werde ich meinen echten namen nehmen, da bringt es ja eigentlich nichts?


----------



## Kel (19. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*



Koyote schrieb:


> Man kann also vom Hashcode nicht zurück auf den normalen Zeichencode kommen?


 Das geht natürlich, die Frage ist nur, welchen Aufwand man dafür betreiben will (Rainbow-Tables, Salted, mehrere Runden etc ...), um es zu schaffen bzw. zu erschweren.

MD5 ist wie gesagt nicht mehr angesagt, SH256 mit Salt sollte aber locker ausreichen ,


----------



## Koyote (21. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Ok, ich bleibe mal bei MD5  Das ganze funktioniert jetzt auch so weit ganz gut.

Mal was anderes, was aber auch zum Verschlüsseln dazu gehört :

Ich will einen string, der in eine Textbox eingegeben werde verschlüsselt speichern und dann in einem Label wieder ausgeben. Funktioniert so etwas? Mit MD5 wohl kaum, da man den Code ja nicht so einfach zurückverwandeln kann.


----------



## bingo88 (22. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Dazu musst du eine richtige Verschlüsselung einsetzen, bspw. AES/Rijndael oder RSA. Natürlich benötigst du dafür ein Passwort, das du dann auch irgendwie eingeben müsstest.


----------



## Koyote (22. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Und so eine Verschlüssellung ist nicht auslesbar/ zurückverfolgbar?


----------



## bingo88 (22. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Ja. Momentan gelten diese verfahren als sicher. Wenn die implementierubg korrekt ist


----------



## Koyote (22. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Ok, mache ich mich morgen oder am WE mal dran.

Noch mal was zur Passwordverschlüsselung mit HASH MD5 : Der Hashcode ist ja in ner Variable gespeichert. Kann man den Wert der Variable denn von außen auswechseln? Denn dann könnte man ja einfach nen anderen HASH Code einsetzen und dann hat man das Passwort ja sozusagen auch umgangen!?


----------



## Kel (22. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*



Koyote schrieb:


> Kann man den Wert der Variable denn von außen auswechseln?


 Ja, das ist möglich. Bei Onlineanwendungen soweit kein Problem, da man ja nur Zugriff aufs Frontend hat, nicht aufs Backend mit der Datenbank etc.

Mit einem Hexeditor sollte das bei einer Desktopanwendung machbar sein, falls ein Obfuscator nicht dagegen hilft?


----------



## bingo88 (22. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Ja, das kann man. Normalerweise schützt man ein System halt auch durch die Verschlüsselung, so dass man durch das Austauschen des Passworts trotzdem keinen Zugriff bekommt. Das Problem lässt sich halt nur umgehen, wenn es kein Zugriff auf den hash möglich ist. Bei einer Webanwendung (Forum etc) wird zum Beispiel der Hash-Wert in einer Datenbank hinterlegt (neben den anderen Daten) und normalerweise sollte keine andere Anwendung bzw. kein Anwender direkten Zugriff auf die DB haben.


----------



## Koyote (22. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Und wie kann ich jetzt den HASHWert sicher hinterlegen bzw. mich vor einer Veränderung schützen? 
Bin mit dem Hauptprogramm schon um einiges weiter, aber das bringt ja alles nichts, wenn das Passwort nicht läuft


----------



## bingo88 (22. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Wie ich ganz zu Beginn schon gesagt habe: Benutzer legt ein PW fest, mit welchem der zu schützende Inhalt verschlüsselt wird. Lokal wirst du keine* sichere Zugangskontrolle hinbekommen.

* Man könnte das eventuell über Berechtigungen lösen. Beispielsweise wird das Passwort zu deinem Benutzeraccount ja auch als Hashwert gespeichert, du kannst diesen als Benutzer aber nicht direkt verändern (und somit ein neues PW setzen). Der Zugriff wird also eingeschränkt. Wie dem auch sei, für eine normale Anwendung ist das eigentlich der vollkommen falsche Ansatz.


----------



## Koyote (22. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*



bingo88 schrieb:


> Wie ich ganz zu Beginn schon gesagt habe: Benutzer legt ein PW fest, mit welchem der zu schützende Inhalt verschlüsselt wird


 Aber dann wird das PW ja wieder als Hash gespeichert und der Hash kann wieder verändert werden? 

Gibt es also keine Variante einen Hashcode sicher zu speichern? Ich könnte einen USB-Stick als Schlüsselkarte verwenden, aber dann müsste ich den jedes mal rein- und rausstecken. Das nervt auch


----------



## bingo88 (22. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Nein, du verschlüsselst den Inhalt ja mit dem Klartextpasswort. Den Hash speicherst du nur, um schnell prüfen zu können, ob das PW stimmt ohne einen Entschlüsselungsversuch unternehmen zu müssen (wenn das PW nicht stimmt, kommt sowieso beim Entschlüsseln nur Müll raus). Wenn du nur kleine Datenmengen verarbeitest, kannst du dir das Hashen eigentlich auch ganz sparen, dann guckst du beim Entschlüsseln einfach, ob Müll rauskommt.


----------



## Koyote (22. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Beim Entschlüsseln? Es wird doch gar nichts entschlüsselt!?



bingo88 schrieb:


> Den Hash speicherst du nur, um schnell prüfen zu  können, ob das PW stimmt


 Aber wenn der gespeicherte Hash verändert wird, kommt man doch ganz leicht rein. Es müsste also eine Möglichkeit geben den Hash so zu verstauen, dass er nicht verändert werden kann.


----------



## bingo88 (22. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Sag mir bitte mal ganz genau, was du vorhast. Soll das einfach nur ein Login sein und wenn ja, was soll damit geschützt werden? Eine auf Hashwerten basierende Zugangskontrolle, bei der die Werte manipuliert werden können, ist natürlich nutzlos, das stimmt.


----------



## Koyote (22. März 2012)

Also: ich programmiere eine art persönliches programm. Alle funktionen, die ich gerne benutze angepasst in einem programm. 

Das loginfenster soll den zugang zum eigentlichen fenster versperren. Dazu gebe ich ein klartext pw ein, das in den hashcode verwandelt wird und dann mit einem bestehenden hashcode verglichen wird. Das problem ist, dass man diesen hashcode von außen ja verändern kann.

Später möchte ich meine termine etc. Die ich in das programm eingebe auch noch verschlüsselt speichern, aber so, dass man sie wieder anzeigen lassen kann.


----------



## bingo88 (22. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*



Koyote schrieb:


> Später möchte ich meine termine etc. Die ich in das programm eingebe auch noch verschlüsselt speichern, aber so, dass man sie wieder anzeigen lassen kann.


 Das solltest du sofort machen (hatte ja schon erwähnt, wie man das machen könnte). Ansonsten kannst du nämlich super-duper-mega Hashs bilden bis zum Ende aller Tage aber jeder kann die Datei mit einem externen Editor einfach öffnen und ansehen.


----------



## Koyote (22. März 2012)

Meinst du das hier? Soll ich das dann auch fürs pw machen oder wie?



			
				bingo88 schrieb:
			
		

> Dazu musst du eine richtige Verschlüsselung einsetzen, bspw. AES/Rijndael oder RSA. Natürlich benötigst du dafür ein Passwort, das du dann auch irgendwie eingeben müsstest.


----------



## bingo88 (22. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Ich würde das so machen: Du legst in deinem Programm eine neue Projektdatei an (da wird dann z. B. der Kalender drin gespeichert), z. B. über Datei->Neu. Dann muss der Anwender zuerst ein Passwort festlegen, welches zur Verschlüsselung dieser Datei verwendet wird. Das muss auch nirgendswo gespeichert werden, es soll ja geheim sein. Jedenfalls gibst du dann deine Daten ein und speicherst die Datei (-> verschlüsseln). Beim nächsten Öffnen der Datei musst du dann das zuvor festgelegte Passwort wieder eingeben um den Inhalt der Datei zu entschlüsseln. Dann kannst du die Daten angucken und ggf. ändern und wieder verschlüsselt speichern. Wenn jemand mit einem Editor in die Datei sieht, wird er nur den verschlüsselten Inhalt sehen und damit kann man in der Regel nichts anfangen 

Wenn man gegen Profis antritt, muss man natürlich noch ein wenig mehr machen. Man kann zum Beispiel unter Umständen den entschlüsselten Dateiinhalt bzw. Passwörter aus dem Arbeitspeicher auslesen und solche Späße


----------



## AMD (22. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Man könnte es auch einfach mit einer XOR Verschlüssung machen.
Zwar nicht super sicher aber in der Regel reicht das aus. Weiss ja nicht was du damit machen willst? (Hab aber auch nicht jede Seite gelesen im Thread)...


----------



## Skysnake (23. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Das mit dem sicheren Speichern ist so eine Sache. Du kannst eben nur sehr wenig "sicher" speichern. Deswegen basiert sowas schon oftmals auf berechnungen, die eben nciht einfach ausgelesen werden können. Aber so tief in der computerkryptografie bin ich auch nicht drin [/QUOTE]
 Man kann gar nichts sicher speichern, wenn denn einer da ist, und es wirklich drauf anlegt....

Daher sind ja auch alle guten Verschlüsselungen Quelloffen. Selbst mit bekanntem Verfahren ist es halt nicht möglich das Verfahren zu knacken, weil einem Teile unbekannt sind.



Koyote schrieb:


> Ist richtig so.
> 
> Es gibt also keine sichere Variante?


 Jaein. Wenn du nie auf die Daten zugreifst, dann schon, wenn dus machst, machste auch das Tor auf für Angriffe, über den RAM etc.



> Weil wenn jemand den Hash hat, kann es sich doch auch einfach ein Programm programmieren, das mit der gleichen methode wie meins funktioniert?


 Nein kann man nicht, da man zwar das Ergebnis hat, aber nicht die HASH-Funktion. Der Trick dabei ist es ja, das in dein Programm etwas eingegeben wird, das etwas obskures damit macht, und dann einen HASH-Wert ausrechnet, und wenn der dann mit dem gespeicherten übereinstimmt, dann wird erst frei gegeben. Den gespeicherten HAsh-Wert zu ändern führt nur zu einem: Keiner kann mehr drauf zugreifen 

Du musst halt alles innerhalb deines Programms erledigen. Das schützt dich aber nicht gegen Reverse-Engineering. Also dem rückübersetzen deines Binären Programms in menschlich lesbaren Code. Du musst also innerhalb deines Codes also Funktionen einbinden, womit dein Parsing nicht vorhersagbar wird, bzw. du musst den Teil deines Codes mehrfach kapseln. Das Problem dabei ist, jeder Kann da mit genug Aufwand sich durch ackern, da dein Programm ja wissen muss, wie es an seine eigenen Daten ran kommt...

Du kannst natürlich die entschlüsselung des Programmcodes vom Schlüssel selbst abhängig machen. Dann musste halt dein Programm schon mit einem nicht im Programm enthaltenen Schlüssel ausliefern, der dann halt geändert werden muss durch den Nutzer. DAS wäre dann ziemlich sicher, schützt gegen auslesen aus dem RAM aber noch immer nichts.... Um das Problem wirste auch nicht rum kommen, so lange du keine externe Hardware dafür verwendest.

Erst damit kannste ein sicheres System aufbauen.

Das wird aber ziemlich sicher über deine Möglichkeiten gehen 

Allein das selbstverschlüsseln der Programmdaten stell ich mir äußerst komplex vor


----------



## Koyote (24. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Habe mal nach der Verschlüsselung gegooglet und bin auf folgendes gestoßen : vb@rchiv · Tipps & Tricks · (Text-) Verschlüsselung (VB.NET)
Was meint ihr dazu?


----------



## Low (24. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Ich würde einfach mit HWID arbeiten und es einfach Verschlüsseln.


----------



## bingo88 (24. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*



Koyote schrieb:


> Habe mal nach der Verschlüsselung gegooglet und bin auf folgendes gestoßen : vb@rchiv · Tipps & Tricks · (Text-) Verschlüsselung (VB.NET)
> Was meint ihr dazu?


 Das ist ein Beispiel für die AES-Verschlüsselung (Rijndael). Die könntest du nehmen, das Beispiel sieht mir auf den ersten Blick brauchbar aus.


----------



## Koyote (25. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Und die Verschlüsselung wäre dann auch sicherer? Schaue sie mir heute mittag mal genauer an.


----------



## bingo88 (25. März 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*



Koyote schrieb:


> Und die Verschlüsselung wäre dann auch sicherer? Schaue sie mir heute mittag mal genauer an.


 Ich gehe jetzt mal davon aus, das der Algorithmus im .NET Framework richtig implementiert ist. Von daher ja. Es sei denn du verwendest ein unsicheres Passwort


----------



## Koyote (9. Mai 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Dankeschön, das ganze funktioniert jetzt sehr gut.
Um die "vertraulichen" Strings zu verschlüsseln benutze ich jetzt den AES Algorithmus und das ganze funktioniert so, wie ich mir das Vorstelle.

Jetzt habe ich nur ein Problem beim Login:
Der Login funktioniert so: In einer .txt liegt ein HASH MD5 code. Das Programm wandelt dann das eingegebene Passwort in einen HASH MD5 Code um und vergleicht diesen mit dem in der TXT.
Das ganze ist natürlich ziemlich doof, da man dann ja den HASH Code in der Datei austauschen könnte. Bei der verschlüsselung der "vertraulichen" Strings ist dies ja kein Problem, da das PW schließlich in keiner Datei liegt.

Jetzt stellt sich mir die Frage, wie ich den Login Sicher gestalten könnte.
Der Login umfasst ja folgendes:
Login-Name und Passwort.

Wenn ich jetzt den AES Algorithmus verwenden möchte, ist ja das Problem, dass bei jeder Verschlüsselung etwas anderes bei raus kommen kann. Also wenn AES, dann einmal verschlüsseln, abspeichern und dann immer wieder entschlüsseln und abgleichen. Aber mit welchen Daten? Wenn ich Login und Passwort nehme, kann man das doch wieder in der Datei ändern 
Sollte ich das Verschlüsselungspasswort dann gleich in den Code schreiben (halt ein langes, sicheres)? Könnte man da ran kommen? Das Problem ist dann auch, dass dieses Verschlüsselungspw halt nicht veränderbar ist aber das PW vom Benutzer... Ergo: Programm ein 2. mal Downloaden, datei erstellen lassen, austauschen und wieder ist der Login umgangen 

Ich bin gerade leider echt etwas Ratlos, wäre toll, wenn mir in diesem Thread nochmal geholfen werden könnte. 

Gruß Tim


----------



## bingo88 (9. Mai 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Ein Login ist nur sicher, wenn die Vergleichsdaten sicher sind, was bei einer lokalen Installation als nicht möglich angesehen werden kann (zumindest schwer zu erreichen). Passwörter im Code sind ganz schlecht. Es gibt zwar Techniken, sowas zu verschlüsseln, aber man kann halt mittels Analyse des Programms den Algorithmus knacken und so doch an das Passwort kommen. Was mir jetzt so spontan dazu einfällt, wäre die Login-Funktion für die eigentliche Verschlüsselung zu verwenden. Falsches Login -> Daten nicht lesbar.


----------



## Koyote (9. Mai 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Genau darum habe ich ja gerade auch so große Probleme dabei 

Wie meinst Du das mit der Login-Funktion im Zusammenhang mit der eigentlichen Verschlüsselung? Meinst du, dass man durch den Login gleich die Daten entschlüsselt?
Dann wäre das Problem, dass die Login Funktion nur zum Programm führen soll und die Daten noch nicht anzeigen soll, da es dafür einen extra Tab gibt.


----------



## Skysnake (9. Mai 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

du kannst auch für jeden Nutzer ein File anlegen, in dem das pw steht, und selbiges mit dem Hash selbst wieder verschlüsseln, der als PW genutzt wurde. 

Um auf die Daten zugreifen zu können, bildest du aus dem pw in Verbindung mif dem username einen hash, den du dann noch solden kannst, und nimmst das nimmst du dann um das gespeicherte PW zu entschlüsseln. 

schau dir einfach dazu mal den PW schutz unter linux an. Der ist SEHR gut


----------



## Koyote (25. Mai 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Danke für die Antwort. Deine Erklärung habe ich mir mehrmals durchgelesen, verstehe sie leider noch nicht, die Datei kann doch dann wieder geändert werden oder nicht? 

Habe mal nach dem Linux Schutz geschaut...


> *Funktionsweise des aktuellen Linux-Passwort-Systems*
> 
> 
> Userinformation werden in /etc/passwd und Passwörter  in der Datei /etc/shadow gespeichert.
> ...


Aber auch hier wäre doch die Datei Austauschbar, oder? 

Das Problem ist ja, wenn ich ein Passwort generiere und man weiß, wie es generiert wird, ist es doch kein Problem einen Klartext String zu nehmen, diesen nach dem Prinzip zu verschlüsseln und den Verschlüsselten String dann in die Datei stecken.
Wie machen das denn andere offline funktionierenden Programme mit Passwortabfrage?


----------



## bingo88 (25. Mai 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Die Datei ist austausch- bzw. beschreibbar, allerdings braucht man unter Linux dafür in der Regel root-Rechte und wenn man die hat, kann man das PW auch direkt ändern.


----------



## Koyote (25. Mai 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Ok, mit einer Windows-Forms Anwendung kann man das dann aber nicht realisieren


----------



## bingo88 (25. Mai 2012)

*AW: Visual Basic 2008 Verschlüsselung - Sicherheit?*

Ja, gut möglich. Mir fällt spontan zumindest nichts ein, was dem nahe kommen würde.


----------

