» »

skrivanje gesel

skrivanje gesel

|Luka| ::

Imam sledeč problem:
v c-ju sem napisal nek program. Sedaj pa da bi zgledal bolj "profesionalno", bi rad dodal se geslo. S tem (geslom) ni bilo tezav, problem pa je v tem, da zelim geslo zakriti z zvezdicami:
npr:
Vpisite geslo: *****
in program mi avtorizacijo zavrne ali pa ne.
Kako zakodirat tako stvar?

LP Lix

freejack ::

Hmm,..to bi pa tut jst rad vedel. Kje sploh začet, pr scanf al je fora kje drugje... Teoretično bi lahk tko naredil, da ko vneseš znak, ga C popravi v *, ampak da bi posredoval podatek morš pritisnit RET, tko da to bolj odpade, razen če bi kaj podobnega integriral v scanf ukaz. Mah, nimam pojma,..kdo ve?

blabla ::

Mogoče bi z getchar prebral znak, takoj za tem vrgel putchar(backspace) in se en putchar(*).
Samo ideja

virtual_reality ::

Tu imate mojo resitev. Enostavno pa dela 100%. Algoritem bere geslo vse dokler ne pritisnemo ENTER.

#include <conio.h>
#include <iostream>
#include <string>

void main()
{
int ch;
std::string buffer;
while ((ch = getch()) != 13)
{
buffer += ch;
std::cout << "*";
}
std::cout << "\n" << "Vase geslo: " << buffer;
getch();
}
"C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, it blows away your whole leg."

|Luka| ::

Te moram razocarati, da zadeva ne dela dobim namrec ene cudne znakce (smijlije).

LP Lix

virtual_reality ::

Dela sigurno, ker sem preizkusil (Visual C++ .Net).
"C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, it blows away your whole leg."

|Luka| ::

Ne vem, če se sicer prevajalniki tako razlikujejo (borland c/c++ builder 5.5.1), ampak meni zal:'( ne dela.
LP Lix

virtual_reality ::

A ti sploh prevede moj primercek? Ce ti prevede, pa ti vseeno povzroca probleme, poskusi spremeniti naslednje:
std::string buffer;
v
std::string buffer = "";

in na koncu se spremeni:
std::cout << "\n" << "Vase geslo: " << buffer;
v
std::cout << "\n" << "Vase geslo: " << buffer.c_str();

Razlicni prevajalniki imajo vcasih neko stvar razlicno implementirano, pa potem prihaja do tezav. Zato pa so si izmislili ANSI standard, sam vseeno...

V glavnem preizkusi, pa porocaj o uspehu/neuspehu.

lp
"C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, it blows away your whole leg."

|Luka| ::

Zal se vedno ne dela.:'(, a imas kaksno drugo resitev.
Sem poskusil napisat kodo v C (ne C++) pa ni delalo.

LP Lix

virtual_reality ::

To ti v Cju ne bo delalo :P . Rabis cistokrvni C++, ker uporablja iostream in string (tega v klasicnem Cju ni). Cak mal bom prilagodil klasicnemu Cju. Tu imas:

#include <conio.h>
#include <stdio.h>
#include <string.h>

void main()
{
char ch[2], buffer[128];
strcpy(buffer,"");
ch[1] = '\0';
while ((ch[0] = getch()) != 13)
{
  strcat(buffer,ch);
  printf("*");
}
printf("\nVase geslo: %s", buffer);
getch();
}

Pazi gor pri ch[1] = '\0'; -> za \ je nicla in ne crka O
"C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, it blows away your whole leg."

|Luka| ::

VR:

Zadeva v C-ju deluje BP:D .

THX se enkrat,

LP Lix

cyer^3d ::

Programck ma sicer potencialni buffer overflow pri predolgem passwordu:)

virtual_reality ::

Ce se hoces znebiti buffer overflowa uporabi zgornjo verzijo napisano v C++. Da se sicer tudi v Cju z dinamicno alokacijo pomnilnika, a o tem raje kdaj drugic...
"C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, it blows away your whole leg."

cyer^3d ::

virtual reality: dinamicna alokacija ti nic ne pomaga, ce bos pisal izven bufferja. Lep IF stavek v zanki, oz se en pogoj v WHILE bi resil vse.

lp

virtual_reality ::

Itak da bi dinamicna alokacija pomagala. Imel bi en stevec znakov, potem pa bi klical funkcijo realloc(stevilo_prebranih_znakov,...). Seveda bi pred vstopom v zanko moral najprej klicati funkcijo malloc(...). V glavnem zadeva bi 100% delovala brez buffer overflowa, za gesla poljubne dolzine. Edina omejitev je kolicina pomnilnika, ki ga imas na voljo :D
"C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, it blows away your whole leg."

virtual_reality ::

Aja pa na koncu programa bi moral pocistiti pomnilnik za sabo s klicom funkcije free(...).
"C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, it blows away your whole leg."

cyer^3d ::

virtual reality:
Motis se. Ne bi bil omejen z kolicino pomnilnika marvec z zmoznostjo OS in njegova memory managerja. Stalna re-allokacija bi delovala samo do zmoznosti OSa. Tako bi spet potencialno prislo do overflowa. Tudi ce recimo allociras na skladu memory si omejen s kolicino in to ne z memory temvec spet z OS in pa samim compilerjem.
Pravilna resitev da se izognes buffer overflowu je samo pogoj, taksen kot sem ti ga napisal.

lp

virtual_reality ::

Mimogrede: funkcije malloc in realloc vracajo status, ce je bil pomnilnik uspesno alociran. Ce pomnilnik ni bil alociran, vrne NULL, kar bi preveril z if stavkom in po potrebi koncal izvajanje programa z obvestilom: pomnilnik ni bil alociran.

Glede OSa: mislim da OS res ne pusti, da bi eden program alociral ves pomnilnik. V tem primeru bi, kot sem zgoraj napisal, malloc in realloc vrnila NULL. Sicer pa, ko zmanjka fizicnega pomnilnika OS uporabi virtual memory.
"C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, it blows away your whole leg."

cyer^3d ::

Kakorkoli rabis nek pogoj, kot sem napisal ze v 1 postu. Sama allokacija ti ne pomaga, se zmeraj mora biti tam nek IF etc...

Z omejitvijo static memorya (sklad) pri npr. compilerju, ki ga uporablja Visual C++ 6.0, se lahko seznanis ce kliknes na project>>settings>>link>>category(output)>>'stack allocation'...

lp

virtual_reality ::

Malo sm gledal MSDN, kjer za funkcijo malloc pise: Always check the return from malloc, even if the amount of memory requested is small. :D . Drgac pa imam C++ .Net, pa ne najdem tistega kar si napisal.
Ma v bistvu smo malo zasli, na cisto drugo podrocje. Sam se je pa zanimivo pogovarjat o takih zadevah. A ti si drgac profi programer ali se student?
"C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, it blows away your whole leg."

cyer^3d ::

Profesionalno sem par mesecev delal za www.navidez.com (3d grafika, mreza, baze, gsm)...drugace pa sem se vedno student in upam da bom lahko povlekel status se za par let. Tezko je folgat fax, ce zraven delas 'doma' etc. Zelja je lastno podjetje, smer - razvoj 3d grafike. Vedno vec pa me zanima tudi AI (nevronske, genetski alg.), ter sama implementacija AIja kot pomagalo pri raznih projektih.
Ti?

Zgodovina sprememb…

  • spremenil: cyer^3d ()

virtual_reality ::

Ne bos verjel, sam tudi mene vlece v smeri raziskovanja AI. Moram nabavit kake dobre knjige najprej o tem. Drugace sm pa tudi jst student, cez pocitnice pa delam pri eni zlooooo velki programerski firmi.
"C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, it blows away your whole leg."

cyer^3d ::

Srecno potem ter cimmanj bugow :)

virtual_reality ::

Thanks a lot.

Pa se ena misel za konec: Deliver yesterday, code today, think tomorrow.:D
"C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, it blows away your whole leg."


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C strukture, kazalci naloga pomoc

Oddelek: Programiranje
51464 (1359) DavidJ
»

[C] Pomoč pri programu za fax (matrike)

Oddelek: Programiranje
111292 (1035) alphasaphir
»

[c++] Kako ugotoviti katera tipka je bila pritisnjena

Oddelek: Programiranje
141482 (1254) 64202
»

C++ vs. C (strani: 1 2 )

Oddelek: Programiranje
766859 (5850) rokpok
»

C problemček

Oddelek: Programiranje
131062 (865) OwcA

Več podobnih tem