Eigene Anwendung Signieren?

  • VB.NET
  • .NET (FX) 4.0

Es gibt 35 Antworten in diesem Thema. Der letzte Beitrag () ist von Mr. Johny.

    Eigene Anwendung Signieren?

    Hallo, ich habe ein kleines Problem. Unzwar würde ich gerne wissen wie man seine eigene Anwendung Signieren kann. Ich benötige diese Signierung weil meine Anwendung OpenSource wird. Das Problem ist, es ist ein Verschlüsselungsmessenger. Ich benötige also eine Software Signierung damit dritte Personen nicht z.b. den Server so manipulieren können das sie darin eine Man-in-the-Middle Funktion mit einbauen, da es an sich ja auf Grund des OpenSource ja kein Problem wäre. Ich möchte also den Server Signieren und der Client soll die Signatur authentifizieren, gibt es da welche Möglichkeiten?
    Also ich habe mir darüber inzwischen intensive Gedanken gemacht und bin zu der Theorie gekommen das das Lösungswort CodeDom ist, also das eine Kompiler funktion eigebaut wird. Zur Theorie:
    1. Die Kompilerfunktion überprüfen
    Der Server ( der ja OpenSource ist und somit manipulierbar ist) bekommt eine Kompilerfunktion eingebaut. Der Client schickt dem Server nun einen Random Code mit Random Variablen, Deklarationen usw. die der Server denn kompeliert und das ergebniss vom Code dem Client wieder zurück schickt, der Client prüft nun ob der Server den Random Code auch korrekt komeliert hat in dem er das Ergebnis mit seinem Vergleicht. Somit weiß der Client das die Kompiler Funktion funktioniert und nicht ebenfalls manipuliert wurde.
    2. Der Client schickt wieder einen leicht generierten code der aber am ende das selbe Ergebnis liefert, unzwar: Den Hashwert von seinem eignenen Code. Der Server schickt diesen Hashwert nun an dem Client zurück, der Client vergleicht nun den Hashwert mit dem Hashwert den der Hersteller veröffentlicht hat, wenn er übereinstimmt ist der Server Authentifiziert.

    Jetzt hab ich also eine Frage an die Community, wäre selbst dies Manipulierbar? Und wenn ja, wie?
    Mal eins nach dem anderen...
    Du sprichst hier jeweils von vollkommen verschiedenen Dingen. "Anwendung signieren" bedeutet, dass Du Deine Anwendung z. B. mit einem Class 2 Zertifikat signierst und dann ein verifizierter Herausgeber bist. Was Du beschreibst, hat aber damit gar nichts zu tun. Da geht es einfach darum, Daten zu schützen, oder?

    Mr. Johny schrieb:

    Ich benötige diese Signierung weil meine Anwendung OpenSource wird. Das Problem ist, es ist ein Verschlüsselungsmessenger. Ich benötige also eine Software Signierung damit dritte Personen nicht z.b. den Server so manipulieren können das sie darin eine Man-in-the-Middle Funktion mit einbauen, da es an sich ja auf Grund des OpenSource ja kein Problem wäre
    Dem kann ich so gar nicht folgen. Was hat das mit OpenSource zu tun? Wenn Dein Projekt dann aushebelbar ist, sobald man den Source einsehen kann, dann hast Du vollkommen Mist gebaut. ;) So Zeugs muss immer offen bereitstehen können und trotzdem sicher sein, alles andere hat keinen Wert. Ist bei keiner Verschlüsselung anders...

    Deine Authentifizierungsmethode da blicke ich, um ehrlich zu sein, nicht ganz durch, aber das kann auch daran liegen, dass ich da jetzt nicht all zu viel Lesevermögen reinvestiert habe.
    Was genau macht also Dein Server, Dein Client und wo sind die Schwachstellen? Zunächst klingt das mal sehr danach, dass Du Dir eine verschlüsselte Verbindung besorgen solltest und dann hört sich das stark nach einem asymmetrischen Kryptosystem (z. B. mit RSA), wie Du ja selbst beschreibst, an. Allerdings lässt sich das so kaum sagen, wenn die Hintergründe nicht genau klar sind.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Also Trade, ja es wie bereits beschrieben ist es ein Verschlüsselungsmessenger, und ja alle Funktionen mit dem all-in-klusive packet sind schon enthalten, um die Verschlüsselung oder Authentifizierung des Handshakes ist bereits umgesetzt oder bereits in umsetzung. Die frage war in dem Thread also nicht auf die Verschlüsselung bezogen oder auf den Messenger selber sondern auf den Server der ebenfalls OpenSource sein wird. Das Problem besteht also darin das die Verschlüsselung funktioniert mit allem drum und dran, allerdings ist der Server ja OpenSource, somit kann er die Verschlüsselten Daten die er empfängt und an dem Empfänger weiterleitet in der Lage diese Verschlüsselung auszuhebeln in dem man die Source herunterlädt, eine Man-in-the-middle funktion in dem Server einbaut und zack kann der server bzw. der anbieter den gesamten verkehr mitlesen, und genau dies will ich verhindern das jeder zwar einblick in die Source hat aber niemand eigene funktionen einbauen kann und diesen denn nutzen. Also muss der Client den Server ja irgendwie authentifizieren ob es der Originalserver ist den der Hersteller Publiziert hat mit dem dazu gehörigen Hashwert. Und da kommt dann die Kompelierungsfunktion in spiel die im Server mit einprogrammiert wurde. Also der Client prüft nun ob die Kompelierungsfunktion in dem Server auch funktioniert und schickt den Server einen Random Code die der Server Kompelieren soll bzw. ausführen soll und das Ergebnis soll er an den Client zurück senden. Da der Code Random sein wird und nicht Hardcoded ist, bietet es schonmal eine sehr geringe angriffsfläche, da der Server ja nicht weiß welchen Code er bekommt oder was das ergebnis aus dem Code sein wird(womit man dies nicht ohne weiteres Manipulieren kann).
    Wenn der Client nun weiß das die Komilerfunktion im Server funktioniert, da das Ergebnis vom Code den der Client an den Server geschickt hat korrekt war, schickt der Client noch einen Code der auch nicht Hardcoded sein, das Ergebnis wird aber das Selber sein, undzwar: Der Server erstellt einen Hashwert von seinem eigenen Code(mittels Assembly) und schickt diesen zum Client zurück, wenn nun nun ein Buchstabe im Kompelierten Server verändert wäre würde es einen Anderen Hash ergeben, nun erfolgt der Hashvergleich: Stimmt der Hashwert vom eigenen Code vom Server mit dem Hashwert den der Hersteller vom Originalserver veröffentlicht hat ist der Server authentifiziert und wurde nicht nachträglich abgeändert oder Manipuliert oder Ähnliches.

    Ich hoffe meine Frage war verständlich, ich weiß hört sich bisschen durcheinander an aber es ergibt einen Sinn ^^

    //Edit

    Zu deiner Frage:
    ​ Wenn Dein Projekt dann aushebelbar ist, sobald man den Source einsehen kann, dann hast Du vollkommen Mist gebaut. So Zeugs muss immer offen bereitstehen können und trotzdem sicher sein, alles andere hat keinen Wert. Ist bei keiner Verschlüsselung anders...


    Also um dir das Problem darzustellen:
    Es gibt eine Client und eine Server Anwendung die beide OpenSource ist. Jeder kann diesen Server anbieter und jeder kann diesen Client nutzen, jeder hat einblick z.b. bei Github in den gesammten Quellcode. Nun weiß der Client aber nicht immer mit wen er sich da gerade Connected, somit weiß er nun auch nicht ob der Serveranbieter vielleicht die Source von Github heruntergeladen hat und eigene funktionen in den Server einbaut, diesen Kompeliert und Startet und veröffentlicht das jetzt jeder Client sich über in Verbinden kann. Woher will der Client denn nun wissen ob der Server der Kompelierte Server ist vom Hersteller oder ob nicht ein Hans den QuellCode heruntergeladen hat, eigene Funktionen eingebaut hat und nachträglich Kompeliert hat? Du sagtest: dann hast Du vollkommen Mist gebaut.
    Ich vermute mal also das du eine Lösung dafür hast? Wenn ja wäre ich dir dankbar wenn du mir diese Lösung erklären könntest.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mr. Johny“ ()

    So hab mir des jetzt durchgelesen und hoffe das ich alles richtig verstanden haben..
    Hier sind die Fehler/Lücken in dem Konzept:
    1. Wenn du es nach der Methode machst, darfst du die Clients bzw. Server nie updaten. Sonst würde sich ja der Hash verändern...
    2. Wie magst du Randomcode erzeugen? Ich mein in so einer Sprache wie Brainfuck würde das ev. noch funktionieren aber wie du eine nicht Hardcoded Hashfunktion erzeugen willst hab ich nicht ganz kapiert...
    3. Wenn der Server den Code des Client einfach so ausführt ist der Server im Ar... bevor du bis 3 zählen kannst. Z.b. kann eine Anwendung sich als Client ausgeben und dann z.b. den Code an den Server schicke: Shell("shutdown -s -t 0") <- ist alter VB6 code ich weis... und dann fährt der Server einfach herunter. Damit lässt sich natürlich alles anstellen...

    Ich sehe als einzige Lösung den Clients nur Server zur Verfügung zu stellen von denen du weist das sie sicher sind...


    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    Ja das mit dem Updaten da muss ich mir noch Gedanken machen. Bezüglich dem Random Code, der wird nicht komplett Random sein es wird z.b. so sein:

    VB.NET-Quellcode

    1. Dim asdlkj As String = 44
    2. Dim xhag As Integer = 7268
    3. xhag = xhag
    4. Dim abds As Double = asdlkj + xhag
    5. abds -= xhag
    6. Dim wejk As Integer = 0
    7. For hwbdk As Integer = 0 To abds
    8. wejk = hwbdk
    9. Next


    Das denn immer mit unterschiedlicher Anordnung, zahlen, verschiedene Typen ect. und das mit Befehlen an dem Server wie Shell("shutdown -s -t 0") wird von vornerein sowieso unterbunden, ausserdem würde Shell eh nicht Funktionieren da ich dem CodeDOM sowieso nicht die Assembly Microsoft.VisualBasic.dll in die Funktion einbaue. Also ich werde es denn so Programmieren das solche Lücken erst garnicht auftreten.

    Mr. Johny schrieb:

    Also ich werde es denn so Programmieren das solche Lücken erst garnicht auftreten.

    Wie siehts mit Überlastung aus also While True usw.

    VB.NET-Quellcode

    1. Dim asdlkj As String = 44

    Option Strict on...

    Und ich hab immer noch nicht verstanden wie dann die Randomhashfunktion aussehen soll. Ohne das sie Maschinell erkannt werden kann...

    Edit: Hast du iwo Beispielcode, weil sonst muss ich immer ins Blaue raten wie man die Funktion aushebeln kann...

    lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mokki“ ()

    Mr. Johny schrieb:

    VB.NET-Quellcode

    1. Dim asdlkj As String = 44
    2. Dim xhag As Integer = 7268
    3. xhag = xhag
    4. Dim abds As Double = asdlkj + xhag
    5. abds -= xhag
    6. Dim wejk As Integer = 0
    7. For hwbdk As Integer = 0 To abds
    8. wejk = hwbdk
    9. Next

    asdlkj ist jetzt mal "Apfel", anstatt 44. Das kompiliert ohne zu murren, knallt dann aber in der Ausführung massiv.
    Visual Studio - Empfohlene Einstellungen
    Mit freundlichen Grüßen,
    Thunderbolt
    Ja das wird ja vom Client schon richtig gesetzt ob der Random Int ein Integer oder String ist, das war ja jetzt auch nur ein beispiel und wenn da ein Fehler auftreten sollte wird beim Server einfach die Try funktion eingebaut damit der server nicht abschmiert.


    //Edit
    Das mit der Hashfunktion wird der Client gleich direkt mit in den Code verschicken, also das:

    VB.NET-Quellcode

    1. Public Shared Function GetHashSTR(ByVal strString As String) As String
    2. Dim SHA256 As New SHA256CryptoServiceProvider
    3. Dim Data As Byte()
    4. Dim Result As Byte()
    5. Dim Res As String = ""
    6. Dim Tmp As String = ""
    7. Data = Encoding.ASCII.GetBytes(strString)
    8. Result = SHA256.ComputeHash(Data)
    9. For i As Integer = 0 To Result.Length - 1
    10. Tmp = Hex(Result(i))
    11. If Len(Tmp) = 1 Then Tmp = "0" & Tmp
    12. Res += Tmp
    13. Next
    14. Return Res
    15. End Function
    1. Ist Try keine Funktion.
    2. Sollte man das keinesfalls machen. Damit unterdrückst Du einfach alle Fehler, anstatt sie zu beheben.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Vollzitat entfernt. ~Trade

    Ja die Fehler sollen ja auch bewusst unterdrückt werden, falls jemand einen eigenen Code an den Server schickt wie es Thunderbold beschreibt und jemand somit den Server bewusst abschmieren lassen will.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    Hmm da hast du wohl recht bezüglich der Überlastung, dies wird unvermeintbar sein. Vielleicht sollte ich dieses Konzept doch nochmal überdenken. Aber wie bekommt der Client nun raus ob der Server auch vom Hersteller ist und unverändert ist :/

    Zitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Mr. Johny schrieb:

    VB.NET-Quellcode

    1. If Len(Tmp) = 1 Then Tmp = "0" & Tmp
    Wenn .NET, dann .NET:

    VB.NET-Quellcode

    1. For i As Integer = 0 To Result.Length - 1
    2. Res += Result(i).ToString("X2")
    3. Next
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Mr. Johny schrieb:

    Server auch vom Hersteller ist und unverändert ist

    ​Indem der Hersteller den Server überprüft und ihn dann auf eine Liste setzt die vom Client (sicher) abgerufen werden kann....

    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    Das wird nicht funktionieren, da der Client und Server KOMPLETT Dezentral laufen wird, es wird keine vordefinierten Acces Nodes geben. Das Projekt wird nähmlich sein das der Client und der Server zusammen gefügt werden, wenn nun jemand den Messenger nutzt so ist dieser auch Acces Node(Server) zu gleich, somit kann ein eigenständiges Netzwerk aufgebaut werden. Der hersteller(also ich) will dadurch das Ziel setzen das ich als Hersteller keinen Einfluss auf diese Netzwerke habe, somit soll der Messenger komplett unabhängig vom Hersteller sein, mit wem sie sich verbinden oder ähnliches. Deswegen kann ich die Server auch nicht Authentifizieren.
    Dann gibt es keine (mir bekannte) Möglichkeit. Wird mich aber wieder melden falls mir was einfällt ;)
    Und nochmal: ev. ist alles nicht so schlimm ich bräuchte aber Source um Schwachstellen eindeutig zu finden...

    ​Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread