Sicher Verbindung

Anfängerfragen zum Programmieren mit PureBasic.
netzcoder
Beiträge: 275
Registriert: 27.08.2009 14:14
Computerausstattung: Intel Quad Core 2.5 GHz; 8GB DDR2 RAM; NVIDIA GeForce GT 130 mit 1500 MB; 2TB HDD;
Kontaktdaten:

Sicher Verbindung

Beitrag von netzcoder »

Hallo,

ich benötige eine sicher Verbindung zwischen meinen PureBasic Programm und einer einfachen Website (.de Domain, 1GB Webspace, PHP5, MySQL...).
Ich habe schon mal was von SSL gehört (auch etwas eingelesen jedoch nicht wirklich verstanden...)
Bei meinem letzen Projekt habe ich immer MD5 Checksummen von bestimmten Sachen als Sicherheit gesendet... Jedoch war dies sehr instabil und leicht zu knacken...
Wie kriege ich also eine sicherere Verbindung zustande wo man nicht einfach den Traffic loggen kann und dann alles weiß?
Hoffen ihr helft mir nochmal

Euer netzcoder (php-freak)
Zuletzt geändert von netzcoder am 04.06.2010 15:04, insgesamt 1-mal geändert.
PB 4.40 Final Full Version
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: SSL oder andere sicher Verbindung

Beitrag von TomS »

Z.B. mit XOr-Verschlüsselung. Du benutzt einfach einen relativ langen Schlüssel und speicherst den in deinem PHP-Script und in deinem PB-Programm. Dann verschlüsselst du die zu sendenden Daten und entschlüsselst sie wieder auf dem Server und umgekehrt.
SSL geht eh nur, wenn der Server das unterstützt.
netzcoder
Beiträge: 275
Registriert: 27.08.2009 14:14
Computerausstattung: Intel Quad Core 2.5 GHz; 8GB DDR2 RAM; NVIDIA GeForce GT 130 mit 1500 MB; 2TB HDD;
Kontaktdaten:

Re: SSL oder andere sicher Verbindung

Beitrag von netzcoder »

Okay das ist sicherlich eine Möglichkeit. Danke schon mal. Wenn jemand noch eine hat dann lasst es mich wissen.
PB 4.40 Final Full Version
netzcoder
Beiträge: 275
Registriert: 27.08.2009 14:14
Computerausstattung: Intel Quad Core 2.5 GHz; 8GB DDR2 RAM; NVIDIA GeForce GT 130 mit 1500 MB; 2TB HDD;
Kontaktdaten:

Re: SSL oder andere sicher Verbindung

Beitrag von netzcoder »

Vielen Dank. Hab auch mal auf PureArea.net im Codearchiv geschaut und auch was sehr brauchbares gefunden. Bei Google habe ich einige Tipps für eine XOR-Verschlüsslung gefunden und einer war: "Der KEY muss die gleiche länge wie der Plaintext haben"...

Stimmt das? Eigentlich ja schon denn weniger ist ja schlecht weil es sich dann ja wiederholt und länger bringt ja nicht wirklich was. Könnt ihr mir noch ein paar Tipps geben wie man es anstellt das man die größtmögliche Sicherheit hat?

Euer netzcoder
PB 4.40 Final Full Version
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: SSL oder andere sicher Verbindung

Beitrag von TomS »

Er muss nicht, sollte aber im Idealfall. Außerdem sollte er zufällig erzeugt worden sein. Ein Key der "ABCDE..." lautet ist weniger sinnvoll.
Für nicht-Klartext kann der Key auch kürzer sein, denn wenn du ein Passwort überträgst, dass so lautet "hF7.Ax-Re", kann man mit Bruteforce lange rumtun und muss jede Möglichkeit am Server testen, was immens Zeit kostet.
Wenn das Passwort Bello heißt, braucht sich der Hacker nur den Output vom Bruteforce Programm anschauen und kommt dann auf den Trichter dass Bello sehr viel wahrscheinlicher ist als "g.Hi9" und "l)a.g" und andere kryptische Kombinationen.
Ein möglichst langer Key ist natürlichsinnvoll, wenn du nicht weiß, wie lange die Daten sein können.

Du könntest auch ein One-Time-Pad erstellen.
Also einen seeeehr langen Key.
Nur fängst du nicht immer am Anfang an, sondern zufällig irgendwo.
Dann sendest du einfach das Offset vorne weg.

Anstatt Debug XOrEncode("bla", "key")

Dann folgendes:

Code: Alles auswählen

text.s = "bla"
onetimepad.s="e6M7asdjng1pmgfngmgf"
randomOffset.i = Random( Len( onetimepad ) )
key.s = Mid(onetimepad, randomOffset +1, Len(text))
Debug RSet(Str( randomOffset ), 5, "0") + XOrEncode(text)
netzcoder
Beiträge: 275
Registriert: 27.08.2009 14:14
Computerausstattung: Intel Quad Core 2.5 GHz; 8GB DDR2 RAM; NVIDIA GeForce GT 130 mit 1500 MB; 2TB HDD;
Kontaktdaten:

Re: SSL oder andere sicher Verbindung

Beitrag von netzcoder »

So nun habe ich mich mal drangesetzt und auch was hinbekomen:

PHP:

Code: Alles auswählen

<?php
function xOrcrypt($text, $key)
{
	if(strlen($key) == 0) 
		return "Fehler"; //$text; // Ohne Key keine Verschlüsselung

	$result = "";
  for($i=0;$i<strlen($text);$i++)
  {
    $result = $result.chr(ord($text[$i]) ^ ord($key[$i % strlen($key)]));
	}
	return $result;
}

// $incode = "*4";
$incode = $_GET['xfg'];
$passwort = "HUlwZaL9EvIPE824MLJI95XGb71q6CHk3IVcM2ImrKWMGUC5qziNZtAAUprNO4FaaZiM0SNo0U1nuAVTeMttqRU8I4E36AAYOGgsc23MRMutsFtDIamP5YirgEhAggcZerqtlIV5sfGGN0BmZrabloA0VVI42d5aT9Xky1KWmHbNzDxoY8PE21qYb3unjyIK3ahp8iWT";

$code = xOrcrypt($incode, $passwort); //ver oder entschlüsseln
echo $code; 

/*
echo '<p><b>Klartext:</b> '.$incode.'</p>';
echo '<p><b>Schl&uuml;ssel:</b> '.$passwort.'</p>';
echo '<p><b>Entschlüsselt:</b> '.$encoded.'</p>';
*/
?>
Und mein PB Code sieht so aus:

Code: Alles auswählen

EnableExplicit

InitNetwork()
Procedure.s DownloadToString(URL$, TimeOut=5000)
  Protected Event, Time, Size, String$
  Protected BufferSize = $1000
  Protected *Buffer = AllocateMemory(BufferSize)
  Protected ServerName$ = GetURLPart(URL$, #PB_URL_Site) 
  Protected ConnectionID = OpenNetworkConnection(ServerName$, 80) 
  Protected Inhalt.i
  If ConnectionID 
    SendNetworkString(ConnectionID, "GET "+URL$+" HTTP/1.0"+#LFCR$+#LFCR$) 
    Time = ElapsedMilliseconds()
    Repeat 
      Delay(10)
      Event = NetworkClientEvent(ConnectionID)
    Until Event Or ElapsedMilliseconds()-Time > TimeOut
    If Event
      Repeat
        Size = ReceiveNetworkData(ConnectionID, *Buffer, BufferSize) 
        String$ + PeekS(*Buffer, Size, #PB_Ascii) 
      Until Not Size
      Inhalt = FindString(String$, #LFCR$, 1)
      If Inhalt
        ProcedureReturn Mid(String$,Inhalt+3)
      Else
        ProcedureReturn String$
      EndIf
    EndIf
  EndIf 
EndProcedure

Procedure.s XOREncode(text.s, key.s) 
    Protected result.s, textLen.l 

    textLen = Len(text) 
    If textLen 
        result = text 

        Protected keyLen.l 
        keyLen = Len(key) 

        If keyLen 
            Protected i.l 
            For i = 0 To (textLen - 1) 
                ; using modulo to determine which letter from key to use 
                PokeB(@result + i, PeekB(@result + i) ! (PeekB(@key + (i % keyLen)))) 
            Next i 
        EndIf 
    EndIf    
    
    ProcedureReturn result 
EndProcedure 

Define keygen.s, url.s, str.s

keygen = "HUlwZaL9EvIPE824MLJI95XGb71q6CHk3IVcM2ImrKWMGUC5qziNZtAAUprNO4FaaZiM0SNo0U1nuAVTeMttqRU8I4E36AAYOGgsc23MRMutsFtDIamP5YirgEhAggcZerqtlIV5sfGGN0BmZrabloA0VVI42d5aT9Xky1KWmHbNzDxoY8PE21qYb3unjyIK3ahp8iWT"
url = "http://www.****.de/network/"
str = "Hallo"
Debug XOREncode(str,Mid(keygen,1,Len(str)))

Debug DownloadToString(url+"test.php?xfg="+XOREncode(str,Mid(keygen,1,Len(str))))
Ich bekommen aber leider nur die ersten beiden Zeichen entschlüsselt zurück also hier würde ich anstatt Hallo nur Ha rauskriegen... Jemand ne Idee woran das liegt?

Vielen Dank für eure Hilfe

Euer netzcoder
PB 4.40 Final Full Version
netzcoder
Beiträge: 275
Registriert: 27.08.2009 14:14
Computerausstattung: Intel Quad Core 2.5 GHz; 8GB DDR2 RAM; NVIDIA GeForce GT 130 mit 1500 MB; 2TB HDD;
Kontaktdaten:

Sicher Verbindung

Beitrag von netzcoder »

Hat keiner eine Idee oder ein Codebeispiel? Ich kann den Fehler einfach nicht finden...

EDIT: So ich habe es nun hingekriegt indem ich das mit xOr verschlüsselte nochmal mit Base64 verschlüsselt habe und dies dann an den Server senden.
PB 4.40 Final Full Version
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Re: Sicher Verbindung

Beitrag von Blackskyliner »

Okay... Also debugge ich dein Programm, lese den Key aus und kann die Daten dann wieder abfangen, entschlüsseln und fertig ist der Salat...

Wirklich sicher ist das nicht...

Das Programm sollte entsprechend gesichert sein, am besten mit einem eigenen Packer wo der Algorithmus weitestgehend unbekannt ist etc. damit man den Schlüssel, der ja im Klartext im Programm steht nicht so schnell knacken kann. Oder aber einen Algorithmus der das zur Laufzeit irgendwie entschlüsselt, wobei letzteres auch nur eine Frage der Zeit ist bis man diese dann irgendwann durchs debug-stepping herausgefunden hat...

Möglich währe doch eine Art Serverside-SingleKey Request oder so, wo man den KeyRohling vom Server holt, der einmal gültig ist, sich daraus anhand eines Algo. den richtigen Key erstellt, mit dem man dann wiederum die Nachricht verschlüsselt, welche dann (am besten via private/public key verfahren o.ä.) auf dem Server wieder entschlüsselt werden kann. Dabei wird der Public/Private Key part entsprechend der Entropischen Daten erstellt, die vorher zwischen beiden ausgehandelt wurden...

Natürlich alles sehr theoretisch, Beispiel hab ich auch keins, aber auf jeden Fall wäre das sicherer als des andere. Wobei man dann nur den Algorithmus wiederum isolieren müsste um dann den Key direkt abfangen zu können, den eigenen schlüssel via Algo. erstellen zu können um dann die Daten die getauscht werden entschlüsseln zu können. Das bessere an dieser Methode allerdings wäre, das man dies dann je nachricht machen müsste, wodurch der Aufwand entsprechend größer ist, was einige Leute abschrecken dürfte. :)

Nur um einen Beitrag zu einem Sicherheitsrelevanten Thema gemacht zu haben ;)

Für Leute die mit einem Debugger nicht umgehen können, reicht die XOR Varaiante auch aus um sie davon abzuhalten mitzulesen.

MFG
Blackskyliner
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
netzcoder
Beiträge: 275
Registriert: 27.08.2009 14:14
Computerausstattung: Intel Quad Core 2.5 GHz; 8GB DDR2 RAM; NVIDIA GeForce GT 130 mit 1500 MB; 2TB HDD;
Kontaktdaten:

Re: Sicher Verbindung

Beitrag von netzcoder »

Danke für deinen Beitrag. Ja ich denke auch das sicherste ist das nicht. Meiner Meinung nach wäre SSL eine gute alternative. Leider gibt es hier und auch im Englischen Forum nichts zu SSL. Im CodeArchiv habe ich ein Beispiel gefunden welches jedoch nicht ganz auf mein Problem zutrifft.
PB 4.40 Final Full Version
Antworten