C Login

Hallo Community...
Ich hab ein Problem mit einem kleinen Programm an dem ich arbeite...
Hier erstmal der Code...
Code:
login = fopen( "client.login" , "r" ) ;
    char filepass[ 50 ] ;
    fscanf( login , "%s" , filepass ) ;
    system( "cls" ) ;
    if( login == NULL ) ;
    {
        login = fopen( "client.login" , "w" ) ;
        printf( "Bitte aktivieren sie ihren Client indem sie ein Passwort festlegen:\n" ) ;
        char pass[ 50 ] ;
        scanf( "%s" , pass ) ;
        fprintf( login , "%s" , pass ) ;
        fclose( login ) ;
        system( "cls" ) ;
    }
    if( filepass[ 0 ] == ' ' )
    {
        login = fopen( "client.login" , "w" ) ;
        printf( "Bitte aktivieren sie ihren Client indem sie ein Passwort festlegen:\n" ) ;
        char pass[ 50 ] ;
        scanf( "%s" , pass ) ;
        fprintf( login , "%s" , pass ) ;
        fclose( login ) ;
    }
    else
    {
        printf( "Bitte geben sie ihr festgelegtes Passwort ein:\n" ) ;
        char log[ 50 ] ;
        fscanf( login , "%s" , filepass ) ;
        scanf( "%s" , log ) ;
        if( log == filepass )
        {
            system( "cls" ) ;
            printf( "Der Client wird gestartet...\n\n" ) ;

(...)

else
        {
            MessageBox( 0 , "Ihr Login war fehlerhaft...\nBitte starten sie den Client neu und wiederholen sie die Eingabe..." , "Login fehlgeschlagen" , MB_OK | MB_ICONINFORMATION ) ;
            return 6 ;
        }
Immer wenn ich das ganze starte kommt als erstes wie gewünscht die Registrierungs Meldung...
Das ganze wird wie gewünscht abgespeichert, das hab ich kontrolliert...
Wenn ich den Client dann neu öffne kommt auch die vorgesehene Anmedungs-Meldung... Aber wenn ich dann die abgespeicherten Daten eingebe kommt immer die Fehlermeldung
Ihr Login war fehlerhaft...
die als MessageBox auch dafür vorgesehen ist einen falschen Login zu verbieten...

Aber wieso kann ich mich nicht anmelden obwohl Passwort = Passwort und Username = Username ist???

Ich hoffe ihr könnt mir helfen...
 
1. fscanf ist böse | fscanf is evil
Exe/vollständiger Quellcode mit Compiler vorausgesetzt, kann ein hübsches Lokalexploit entwickelt werden, da hier fscanf einen String beliebiger Länge in einen char [50] eingelesen wird :evil:
2.
Code:
login = fopen( "client.login" , "r" ) ;
    char filepass[ 50 ] ;
    fscanf( login , "%s" , filepass ) ;
    system( "cls" ) ;
    if( login == NULL )
fopen findet keine Datei => login ist NULL, was liest nun fscanf(NULL,%s, filepass) ein?
3.
log == filepass
Common C Programming Errors
Never use the == operator to compare the value of strings! Strings are char arrays. The name of a char array acts like a pointer to the string (just like other types of arrays in C). So what? Consider the following code:
Code:
char st1[] = "abc";
char st2[] = "abc";
if ( st1 == st2 )
  printf("Yes");
else
  printf("No");
This code prints out No. Why? Because the == operator is comparing the pointer values of st1 and st2, not the data pointed to by them. The correct way to compare string values is to use the strcmp() library function. (Be sure to include string.h)
4. allgemein sollten Passwörter nie im Klartext gespeichert werden. Nur als Hash.
 
1. Wusste keine alternative und ist auch nur als test gedacht...
2. Upps ^^ Da hab ich wohl was übersehen...
3. Danke :D
4. Wie speichert man Passwörter denn als Hash?
 
Enkore: Wenn du schon pedantisch seien willst, schlage lieber bcrypt vor. Das ist nämlich "by design" langsam, und damit weitaus besser geeignet für Passwort-Hashing als SHA2. Und auch weil es weitaus schwerer ist bcrypt "falsch" zu benutzen.

Auch hättest du PBKDF2 vorschlagen können für Password-Hashing. Auch wenn es nicht dafür designed wurde, es macht sich dabei gut.

Bcrypt Infos: bcrypt
Bcrypt Implementation: src/lib/libc/crypt/ (bcrypt.c)

/CK
 
Enkore: Wenn du schon pedantisch seien willst, schlage lieber bcrypt vor. Das ist nämlich "by design" langsam, und damit weitaus besser geeignet für Passwort-Hashing als SHA2. Und auch weil es weitaus schwerer ist bcrypt "falsch" zu benutzen.

Auch hättest du PBKDF2 vorschlagen können für Password-Hashing. Auch wenn es nicht dafür designed wurde, es macht sich dabei gut.

Bcrypt Infos: bcrypt
Bcrypt Implementation: src/lib/libc/crypt/ (bcrypt.c)

Ich konnte weder für bcrypt noch für PBKDF2-HMAC-SHA2 eine weitestgehend self-contained Implementation finden, auch wenn ich PBKDF bevorzugt hätte; die von die verlinkte hängt von jede Menge anderem Kram aus dem gleichen Tree ab.
 
Naja, in dem Fall - nicht wirklich nach einer Implementation gesucht zu haben - sind wir beide schuldig Enkore ;)
Eine google-suche nach "bcrypt C implementation" und das ZWEITE Ergebnis ist: https://github.com/rg3/bcrypt .

Zu PBKDF2 habe ich leider nur eine self-contained C++ Implementation gefunden. Die dazu auch noch mehr "ich habe das mal so zum Spaß gemacht" war, als seriös (Ich würde also klar davon abraten, diesen Code zu benutzen, deswegen verlinke ich ihn auch nicht.).

/CK
 
Das ist die Implementierung aus der *BSD libc ;)

Bei PKBDF-2 spricht ja eigentlich nix dagegen das selber zu implementieren, sofern man bereits eine SHA-2-Implementierung an der Hand hat, ist das gar nicht mehr weit. Wesentlich einfacher, als ich dachte...

Anbei: Welche Rundenzahl nimmt man dafür heutzutage so? 100 000 oder doch lieber ne Million oder etwas mehr...? Irgendeine iOS-Version nahm mal 100 000, aber das könnte schon wieder ein paar Jährchen her sein...
 
Zuletzt bearbeitet:
Zurück
Oben