Archief - C: gebruikers opslagen in bestand en wijzigen, goed systeem?

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Noizz.be

Legacy Member
Yuw

De bedoeling is van een quiz programma te maken. De gebruikers kunnen dan inloggen met hun gebruikersnaam en paswoord. Gebruikersnamen, paswoorden, juist geantwoordde vragen en totaal opgeloste vragen moet in een bestand komen.

Ik dacht aan hetvolgende systeem

user.txt:
Code:
user1|paswoord1|0|0
user2|paswoord2|0|0
user3|paswoord3|0|0

is dit een goed systeem?

Wat moet het kunnen? Als bvb user1 is aangelogd, speelt de quiz en heeft 20 op 30 dan moet het bestand veranderen in:

user.txt:
Code:
user1|paswoord1|20|30
user2|paswoord2|0|0
user3|paswoord3|0|0

doet hij daarna weer de quiz (18/25)

user.txt:
Code:
user1|paswoord1|38|55
user2|paswoord2|0|0
user3|paswoord3|0|0

Als dit inderdaad een goed systeem is. Hoe kan ik dan controleren of een gebruikersnaam reeds in gebruik is? (bij het registreren)
Als iemand de quiz gedaan heeft, hoe kan ik de punten aanvullen met den nieuwe score?

Met Vriendelijk groeten
Noizz

Da Turtle

Legacy Member
da ziet er mij goe genoeg uit voor een simpel prog. om te controleren als de gebruikersnaam reeds in gebruik is kan je alle records in een array inladen en elk record checken als de naam nie 't zelfde is als de nieuwe naam.

om de nieuwe score aan te vullen. Kan je alle records voor het record die je wilt wijzigen en alle records erna in een array zetten. Dan het bestand opnieuw schrijven:
- eerste records (ervoor)
- je huidig record
- de rest (erna)

killgore

Legacy Member
xml idd, of werken met een vaste struct (=vaste size van vars die je schrijft).

Tyfius

Legacy Member
ik zou 't gewoon zo basic in een text file houden, en die binair opslaan, da's voor u het snelste en het veiligste :)

Vich

Legacy Member
Even een side-note:
Mensen hebben de neiging om hetzelfde paswoord vaak te herbruiken, dus ik zou er toch iets meer beveiliging insteken. Al is het maar een XOR "encryptie".

tekst XOR paswoord = resultaat
resultaat XOR paswoord = tekst

XOR in C++ is het "^" teken.

Noizz.be

Legacy Member
Vich zei:
Even een side-note:
Mensen hebben de neiging om hetzelfde paswoord vaak te herbruiken, dus ik zou er toch iets meer beveiliging insteken. Al is het maar een XOR "encryptie".

tekst XOR paswoord = resultaat
resultaat XOR paswoord = tekst

XOR in C++ is het "^" teken.

hehe :) hoe wist je dat? :p we moesten de pasworden encrypteren, maar ik had dat nog even links laten liggen :)

tis wel in C da we het moeten doen. Werkt daar ook die encryptie van XOR?

Noizz

S3cT0r

Legacy Member
Ja, de binaire operators waren al in C aanwezig.

& - AND
| - OR
^ - XOR
~ - binaire omkering (dus 00000001 word 11111110)
<<
>> De twee bit shifts

Noizz.be

Legacy Member
maar als ik dus een geëncrypteerd bestand wel wegschrijven, dan ben ik verplicht van een binair bestand te gebruiken? ipv die .txt?

Of kunnen die bitoperatoren ook gebruikt worden als we gaan schrijven en lezen in het .txt bestand?

Noizz

Tyfius

Legacy Member
da kan een .txt zijn, die extensie maakt niets uit, 't is of gij meegeeft wa voor een type dat moet zijn, binair/ansii.

( +b in uw geval)

Noizz.be

Legacy Member
Tyfius zei:
da kan een .txt zijn, die extensie maakt niets uit, 't is of gij meegeeft wa voor een type dat moet zijn, binair/ansii.

( +b in uw geval)

+b, is da normaal ni voor binaire bestanden? Nen txt is toch ni binair?

dit is mijn code voor weg te schrijven:
Code:
			//wegschrijven
			f = fopen("FILES/users.txt","a");
			fputs(username, f);
			fputc('|',f);
			fputs(pass, f);
			fputc('|',f);
			fputc('0',f);
			fputc('|',f);
			fputc('0',f);
			fputc('\n',f);
			fclose(f);

Noizz

Noizz.be

Legacy Member
Bon :)

dit is mijn eerste test, en hij werkt nog niet helemaal blijkbaar :)

Code:
#include <stdio.h>
#include <string.h>

	char gebruikers[80][20];
	char ch;				
	int i=0, j=0;				


	//bestand openen en gebruikersgegevens in array zetten
	f = fopen("FILES/users.txt","r");
	do
	{
		ch = fgetc(f);
		if(ch == '|')
			i++;
		if(ch == '\n')
			j++;

		gebruikers[i][j] = ch;
	}while(ch != EOF);

	for(i=0,j=0;i<80;i++)
		printf("%c",gebruikers[i][j]);

	fclose(f);

Output op het scherm (printf van de array) zijn allemaal zeer vreemde karakters. (blokskes, soms een cijfer, vreemde letter, ... ma dus geen herkenbare tekst)

Bestand ziet er alsvolgt uit (ik heb nu ffkes de newline derbij gezet da ge dus weet waar ze staan):

Code:
User1|paswoord1|0|0\n
User2|paswoord2|0|0\n
\n

Wat doe ik verkeerd?
Noizz

Noizz.be

Legacy Member
Code:
	//bestand openen en gebruikersgegevens in array zetten
	f = fopen("FILES/users.txt","r+b");
	do
	{
		ch = fgetc(f);
		if(ch == '|')
			i++;
		if(ch == '\n')
			j++;

		gebruikers[i] = ch;
	}while(ch != EOF);

	for(i=0,j=0;i<80;i++)
		printf("%c",gebruikers[i]);

	fclose(f);

Probleem is hetvolgende: em zet dus "U" op gebruikers[0][0] derna leest em "s", en zet deze op gebruikers[0][0], maar hij vervangt, en hij mag dat niet. Hij moet de data aavullen
zodat er op gebruikers[0][0] "User1" volledig komt te staan. en als hij dan een "|" leest, moet i++ gedaan worden, en devolgende cel opgevuld worden.

Ik heb al geprobeerd van een strcat() maar dat is een hoop miserie, want die ch is nu een char, en een strcat kan enkel strings aaneenrijgen ...

Kheb dus geen idee hoe ik User1 in gebruikers[0][0] moet krijgen en paswoord1 in gebruikers[1][0] enz enz

Iemand een idee'tje?
Noizz

Vich

Legacy Member
Heb je er wel voor gezorgd dat het laatste karakter van je geëncrypteerde string ook wel degelijk \0 blijft, zodat de string die je hebt ook een string blijft?
Als je strings wegschrijft in files, dan kan je dat beter zo aanpakken:

Code:
struct
{
    char strUser[16];
    char strPassword[16];
};

Je gaat gewoon zeggen hoeveel chars de string inneemt. Meer karakters kan je dan niet in je string zetten (je moet gewoon genoeg voorzien), maar minder kan wel, want hij zet gewoon de \0 terminator ergens in die array en je string wordt automatisch kleiner.

[edit] Dit is wat killgore bedoelde met vaste struct.

Mbv bovenstaand voorbeeld kan je dan ook gewoon de "user XOR password" doen, omdat ze even groot zijn.

Silenger.BE

Legacy Member
Je kan gewoon een txt file gebruiken, de pass te encrypten en dan base64 te gebruiken om die data in leesbare text te zette...
Je kan ook md5 hash gebruiken om pass te saven, dan kan niemand ooit de gebruiker zijn pass weten...

Dus als gebruiker inlogt, gewoon hash zijn pass vergelijk hash in txt file als die gelijk zijn, log je die in en de/encrypt je de data met opgegeven pass.

Noizz.be

Legacy Member
Silenger.BE zei:
Je kan gewoon een txt file gebruiken, de pass te encrypten en dan base64 te gebruiken om die data in leesbare text te zette...
Je kan ook md5 hash gebruiken om pass te saven, dan kan niemand ooit de gebruiker zijn pass weten...

Dus als gebruiker inlogt, gewoon hash zijn pass vergelijk hash in txt file als die gelijk zijn, log je die in en de/encrypt je de data met opgegeven pass.

yu, voor da encrypten. Nen md5 hash kunt ge toch encrypten? Alleh, bij PHP is da toch zo, en aangezien dat hetzelfde heet. Kheb zo een programma om md5 hashes terug te zetten naar gewone tekst :) soit, tis goe genoeg voor de school denkik :p

Noizz

Alvast bedankt voor alle nuttige replies :)

WHiSPy

Legacy Member
md5 omzetten naar gewone tekst is bull. De manier dat md5 tegenwoordig gekraakt wordt is door strings te genereren die worden omgezet naar md5 en zo wordt gezocht naar een match. Dat is dus een random generator-systeem en geen decypt systeem.

killgore

Legacy Member
md5 is one-way encoding (zoals whispy al mooi probeerde duidelijk te maken), enige manieren die ik ken zijn idd brute hacking en iets behoorlijk ingewikkeld dat ik ooit gelezen heb (naam zelfs al vergeten).

Ook kan 1 md5 string van verscheidene gewone strings afkomen (wat logisch is, md5 is een vast aantal bits, terwijl een willekeurige string dat vast aantal kan overtreffen), dus compleet zeker ben je nooit, zeker niet met paswoorden ;).

Md5 gebruik je dus als vergelijkings data, niet als data die moet hergebruikt worden (om bv. op het scherm weer te geven).

het beste is zelf gewoon een combinatie van 4-5 terugdraaibare encripties te gebruiken, dan mag je al vrij zeker zijn dat het veilig is (wat voor dit dus overdreven veel is :p).
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan