Visual Basic 2008 Verschlüsselung - Sicherheit?

Koyote

Volt-Modder(in)
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. :P

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:
Code:
'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
Code:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        
passwort = "123"


Einlesen der Zeichen usw. :
Code:
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

Code:
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.
 
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.
 
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.
 
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 :D
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 :P

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!" :ugly: .....
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:
Code:
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
 
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.
 
AW: Visual Basic 2008 Verschlüsselung - Sicherheit?

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

Code:
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 :D
 
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.
 
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.
 
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 :D

Code:
  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
 
Zuletzt bearbeitet:
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.

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 :P
 
AW: Visual Basic 2008 Verschlüsselung - Sicherheit?

Nicht 100% und vor allem nicht für Anfänger/Fortgeschrittene mal eben so zu machen
 
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.
 
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) :daumen2:
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? :D


Code:
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
 
Zuletzt bearbeitet:
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:
Code:
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 ^^)
 
AW: Visual Basic 2008 Verschlüsselung - Sicherheit?

Das wäre doch dann das, was in meinem post oben steht, oder nicht? Post #14
 
AW: Visual Basic 2008 Verschlüsselung - Sicherheit?

Ja genau. MD5 ist zumindest besser als ein Klartextpassword ;-)
 
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).
 
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? :ugly:
 
Zurück