Sichere Passwortübertragung

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

danibert

Betreff: Sichere Passwortübertragung

BeitragMi, Mai 12, 2010 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich möchte in meiner Anwendung ein Login einbauen, mit dem man seine Benutzerdaten von einem Server abrufen kann. Aus verschiedenen Gründen will / kann ich ich kein SSL-Üvertragung und auch keine RSA-Verschlüsselung realisieren.

Daher mein folgender Ansatz:
1. Meine Anwendung holt sich vom Server eine Session-ID. Diese ist eindeutig und nur für ein einziges Login gültig. Sie wird bei jeder Anfrage neu generiert.
2. Die Anwendung fügt die Session-ID und das eingegebene Paswort aneinander und berechnet dafür einen MD5-Hash
3. Der Hash, der eingegebene Username und die Session-ID werden an den Server geschickt.
4. Der Server hat eine Liste mit allen Passwörtern. Er erzeugt selbst einen Hash aus der Session-ID und jedem vergebenen Passwort und vergleicht es mit dem Übergebebenen Hashwert. Findet er eine Übereinstimmung, vergleicht er noch den eingegebenen Usernamen und loggt den User ein.

Ist das so sicher, oder habe ich einen Denkfehler in meiner Idee?
Kann man den Vorgang noch verbessern?
Danke für alle Tipps

BtbN

BeitragMi, Mai 12, 2010 13:45
Antworten mit Zitat
Benutzer-Profile anzeigen
1) Wieso nicht einfach den Usernamen zusammen mit dem sha256-hash seines Passworts speichern? Dann muss man nicht alle Passwörter durchgehen. Das System erscheint mir da eh sehr seltsam.

2) Perfekt sicher ist das nicht, aber die chance, so einen gesalteten hash zu knacken ist viel geringer als einfach nur das gehashte PW zu senden.

Um eine kleine eigene implementierung von asymetrischer verschlüsselung wirst du da nicht drum rum kommen, um das ganze abzusichern.

Firstdeathmaker

BeitragMi, Mai 12, 2010 14:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Außerdem ist es gefährlich, eine in Klartext gehaltene PW-Liste auf dem Server zu speichern. Daher: Asymetrische Verschlüsselung!
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

danibert

BeitragMi, Mai 12, 2010 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
@Firstdeathmaker
Asymetrische Verschlüsselung - aber wie, ohne RSA und SSL?
Ich muss zugeben, mir fehlt da etwas der Ansatz...

Ich könnte die Passwörter auf dem Server schon verschlüsseln, das ist nicht das Problem, nur der Übertragungsweg ist vorerst relevant...

Firstdeathmaker

BeitragMi, Mai 12, 2010 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Normalerweise lässt man den User einfach sein PW eingeben, und überträgt dann z.B. einfach nur den Hash davon. Dieser wird dann auf dem Server mit dem Login und dem gespeicherten Hash verglichen und fertig ist das ganze. Das ist jedenfalls die einfache Lösung. Alternativ kannst du auch mit der Session-ID arbeiten, dann aber auf dem Hash, sprich:

Server -> Session ID -> Client
Client -> Hash(Hash(PW)+SessionID) + Login -> Server
Server -> Macht lookup in DB für den Login, und schaut, ob der empfangene Hash = Hash(gehashtes PW in der DB + SessionID) ist.

Bei der komplizierteren (und sichereren) Lösung kommst du um RSA nicht herum.

Es ist halt immer eine Abwägung zwischen Sicherheit und Aufwand, du kriegst keine sehr gute Sicherheit hin, ohne das du Aufwand betreibst.


Aber vielleicht erklährst du uns erstmal, was du genau machen möchtest, und wie wichtig die Sicherheit davon ist. Wenn du z.B. nur zur Übung machst, dann würde es sich sicherlich lohnen, RSA anzuschauen. Ich muss dir allerdings zustimmen: Das ist ziemlich kompliziert, zumindest wenn man das nicht im Studium hatte oder sonstige Vorkenntnisse auf dem mathematischen Bereich hat. Es gibt allerdings eine gute Website / Program zu dem Thema die ich dir empfehlen kann: http://www.cryptool.de/



Edit: Geht es dir nur darum, die Authentizität des Users abzusichern, oder willst du, dass kein Außenstehender die Unterhaltung belauschen kann? Was kann man als Gegeben betrachten? Das der Server eine feste IP hat? Ds der Server schon die Logindaten/gehashten PW besitzt und diese sicher übertragen wurden? Wenn das der Fall wäre, dann bräuchte man doch nur ein symetrisches Verfahren (AES) einzusetzen und fertig, oder?
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

danibert

BeitragMi, Mai 12, 2010 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
@Firstdeathmaker
Zitat:
Server -> Session ID -> Client
Client -> Hash(Hash(PW)+SessionID) + Login -> Server
Server -> Macht lookup in DB für den Login, und schaut, ob der empfangene Hash = Hash(gehashtes PW in der DB + SessionID) ist.

So war das geplant, richtig.

Also, was ich machen will: Ich schreibe an einer Anwendung, die bestimmte Informationen von einem Server abruft. Die Informationen an sich sind nicht besonders schützenswert, weshalb ich sie hier nicht weiter beachten will. Der Knackpunkt an der Sache ist: Der Abruf der Informationen ist ein kostenpflichtiger Service, und hierfür muss man sich zuerst mal einloggen. Jedes mal wenn Infos abgerufen werden, wird das Benutzerkonto mit einem bestimmten Betrag belastet - Pay per view, eben.

Es geht bei der Sache nicht um große Beträge, ein Abruf kostet wenige Euro. Aber selbst wenn es auch nur um ein paar Cent geht, ist das alles kein Spaß mehr. Wenn ich die eingegebenen Login-Daten einfach als Hash an den Server schicke, kann das ja mitgelauscht und beliebig oft wiederverwendet werden. Das Mitlauschen an sich ist nicht das Problem, sondern einen Weg zu finden, mit dem jeder Satz Login-Daten nur einmal gültig ist.

Daher meine Idee mit dem Hash, der jeweils die Session-ID beinhaltet. Ich bin nun wirklich kein Mathematik-Genie, was die Sache für mich recht schwierig zu durchschauen/zu implementieren macht.
Wenn ich nun sagen würde, die jedesmal neu vergebene Session-ID wäre 1024 Bit lang und wird zusammen mit dem eingegebenen Passwort mit SHA-256 gehasht - wäre damit eine ernstzunehmende Sicherheit geschaffen?

EDIT:
- Der Server hat eine Feste IP
- Die Logindaten sind über einen sicheren Weg (Zertifikatsbasiertes SSL) auf den Server gelangt
 

danibert

BeitragFr, Mai 14, 2010 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibt es für Blitzmax eine fertigs SSL-Klasse zum Einbinden?

EDIT:
ich habe gesehen, dass man mit CreateHtmlView() ohne weiteres Inhalte über https abrufen kann. Kann man die Rückgabe nicht in eine Variable legen, anstatt sie auszugeben?
 

Macintosh

BeitragFr, Mai 14, 2010 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
nein.
aber um was zurück zu bekommen kannst du doch einfach einen stream auslese, oder habe ich was falsch verstanden?

achso... doppeposts werden hier von den mods nict so gern gesehen :D

Firstdeathmaker

BeitragFr, Mai 14, 2010 16:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Deine Methode:
Zitat:
1. Meine Anwendung holt sich vom Server eine Session-ID. Diese ist eindeutig und nur für ein einziges Login gültig. Sie wird bei jeder Anfrage neu generiert.
2. Die Anwendung fügt die Session-ID und das eingegebene Paswort aneinander und berechnet dafür einen MD5-Hash
3. Der Hash, der eingegebene Username und die Session-ID werden an den Server geschickt.
4. Der Server hat eine Liste mit allen Passwörtern. Er erzeugt selbst einen Hash aus der Session-ID und jedem vergebenen Passwort und vergleicht es mit dem Übergebebenen Hashwert. Findet er eine Übereinstimmung, vergleicht er noch den eingegebenen Usernamen und loggt den User ein.


Mein Vorschlag:
Zitat:
Server -> Session ID -> Client
Client -> Hash(Hash(PW)+SessionID) + Login -> Server
Server -> Macht lookup in DB für den Login, und schaut, ob der empfangene Hash = Hash(gehashtes PW in der DB + SessionID) ist.


Bei deiner Methode ist Punkt 3 und 4 nicht ganz richtig. Bei 3 brauchst du nicht noch die Session-ID zurück zu senden, denn diese hat der Server ja schon. Und bei 4 brauchst du nicht alle PW mit der Session-ID zu hashen, da du ja den Login in Klartext übermittelt bekommst, und nur für diesen das PW mit der Session-ID zusammen hashen musst. Zudem würde ich einfach noch den Requestbefehl mit reinhashen.

Also eine Beispielkommunikation:

Login=Testuser
PW=Sonnenblume
SHA-256(PW)= 7E9029C1D9BC10DEAAB4C4DD7FB03AE8643CC9368899B3735544EBCDDC160FE0
Request=GetInformationAbout,MaxMusterman


Der Server kennt jetzt nur den Login, die SessionId und das gehashte PW.


Client sendet: connectionRequest
Server sendet: sessionid=5343132
Client berechnet: SHA-256(Testuser5343132GetInformationAbout,MaxMusterman7E9029C1D9BC10DEAAB4C4DD7FB03AE8643CC9368899B3735544EBCDDC160FE0)
Client sendet:login=Testuser;GetInformationAbout,MaxMusterman;52D1515E3F85AA431D3B49EE18098873F5B5552B0840F35E9A85DC8EEF62EF54
Server kann nun ebenfalls SHA-256(Testuser5343132GetInformationAbout,MaxMusterman7E9029C1D9BC10DEAAB4C4DD7FB03AE8643CC9368899B3735544EBCDDC160FE0) berechnen, da die fehlenden Informationen ja auch als Klartext übermittelt wurden.

Durch die Session-ID wird ein Angriff durch einmaliges Ausspähen unmöglich gemacht. Keine gleichen zwei Requests haben den gleichen Hash. Also meiner Meinung nach ist das gegen fremde Requests gesichert. Ich bin allerdings kein Sicherheits-Experte, sondern habe das nur gerade in meinem Studium gehabt.

Der Vorteil dieser Methode ist, dass es einfach zu implementieren ist, und die Hashwert Berechnung nicht so viel Rechenleistung kostet wie eine assymetrische Verschlüsselung. Also ich persönlich wüsste jetzt nicht wie man das hacken könnte. Also vorrausgesetzt, das PW ist ausreichend Lang und nicht trivial gewählt, d.h. über eine Wörterbuchattacke oder so invertierbar. Aber ein PW kannst du ja selbst generieren und den Usern zusenden, auf dass die das in ihrer Software eintragen. SHA-256 ist glaube ich bisher nicht leicht angreifbar.


Zu beachten ist vielleicht nur, dass hier wirklich nur der Request des Clients authentifiziert wird, aber jeder die warscheinlich unverschlüsselte Antwort mitlesen kann, da diese ja nicht verschlüsselt wird. Aber nach deiner Beschreibung wäre das ja nicht weiter schlimm. Es ist nur gewährleistet, dass einer der keinen Account+PW bei dir hat auch keine Requests stellen kann.


Edit: Es gibt überigens im Englischen Forum so nen Typen namens Brucey, der hat ein paar Module die dir vllt. helfen könnten:

http://www.blitzbasic.com/Comm...opic=75695
z.B. BaH.Libcurl & BaH.LibcurlSSL sowie BaH.Crypto
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group