Permalänk
Medlem

Lösenordsgenerator

Jag hade behövt lite input ang hur säker min lösenordgenerator är

Tanken är att man skapar ett säkert lösenord mha 2 koder/lösenord som man själv lätt kan komma ihåg. Och med säker menar jag då att det i princip ska vara omöjlig att knäcka.
Varje gång man använder samma koder så får man ut samma lösenord, på så vis behöver man aldrig lagra det genererade lösenordet nånstans, utan det går att återskapa mha av lösenordsgeneratorn och dina 2 koder.

Vad jag gör är rätt enkelt egentligen...
Jag använder SHA512 för att hasha.. Tar hashen på varje kod, lägger ihop dom 2 och tar hashen på resultatet så man får en hash som ska vara bra unik iaf.
Sen börjar det roliga Man hashar den där hashen en halv miljon ggr för att det ska ta lite tid (tar ca en sek att hasha 500k ggr). Sen är det bara att trolla om den resulterande hashen till en sträng, och så är vi färdiga.

Här är källkoden för dom som vill testa.. Jag använder libtomcrypt o libtommath.. Finns i vanligt fall att hämta på www.libtom.org men eftersom den ligger nere nu finns dom här:
ftp://ftp.dk.freebsd.org/pub/FreeBSD/ports/local-distfiles/cp...
Annars är det bara g++ passgen.cpp -opassgen -O3 -ltomcrypt -ltommath
Funkar fint med VC++ också annars.

Nåja, alla kommentarer är välkommen.. Själv tror jag ju att det här är ganska säker men jag vill gärna höra fler åsikter.

Edit: Kan ju ge några exempel också..
hej abc1: X(]w:TBlJh?aS?REetYo?cJ?+K?hQknmE=<l,2m:k@|]ZN,Xfqr.]mrrrP4XG74k
hej abc2: &v1!Fg>Vo0f*}_T!Zvfm/[ix[,OzC*hH%iADTE(fJdDA(tm_#QpbAU[eR:?$Z%k4
hej abc3: ^Qtpi2VMgx|)slr?4Fp7]sLpm=|iUkV?:A7?z3#SMB2rHg=gA1P}z~o-?|,+h)h6
hej abc4: -#xC+aYQ]D2m8^p&8g>U939,%VQ#[1A4qV9G:u>4znV}L8gM53cqd3&{Tt|,=C}P

#include <stdio.h> #include <tomcrypt.h> #include <tommath.h> int main(int argc, char** argv) { if(argc<3) { printf("Usage: %s keyword1 keyword2 [length]\n", argv[0]); return 1; } char *k1 = argv[1]; char *k2 = argv[2]; int length = 64; if(argc>=4) length = atoi(argv[3]); // decide which hashing function we're going to use // sha512 gives nice and long hashes ltc_hash_descriptor hasher = sha512_desc; int hashidx = register_hash(&hasher); if(hashidx==-1) return 1; unsigned char hash[1024], tmphash[1024]; unsigned long hashsize = sizeof(hash); // put hash(keyword) into tmphash after each other hash_memory(hashidx, (unsigned char*)k1, strlen(k1), tmphash, &hashsize); hash_memory(hashidx, (unsigned char*)k2, strlen(k2), tmphash+hashsize, &hashsize); // hash the 2 hashes into 1 hash_memory(hashidx, (unsigned char*)tmphash, 2*hashsize, hash, &hashsize); // now hash the resulting hash a gazillion times // this is to make the process slower, as a brute force attack would take just as many times longer for(int i=0; i<500000; i+=2) { // hash -> temp hash_memory(hashidx, hash, hashsize, tmphash, &hashsize); // temp -> back to hash hash_memory(hashidx, tmphash, hashsize, hash, &hashsize); } // read resulting hash into an mp_int mp_int mp; mp_init(&mp); mp_read_unsigned_bin(&mp, hash, hashsize); char pass[1024]; int passpos = 0; // list of chars we want to use // quotes, backslash left out on purpose as they can give problems with bad code const char chars[] = "0123456789" "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "!?$?%^&*()_-+={[}]:;@~#|<,>.?/"; mp_digit divider(strlen(chars)), remainder(0); // convert hash to password using chars while(mp_cmp_d(&mp, 0)!=LTC_MP_EQ) { mp_div_d(&mp, divider, &mp, &remainder); pass[passpos++] = chars[remainder]; } pass[passpos] = 0; if(length>0 && length<passpos) pass[length] = 0; puts(pass); return 0; }

Visa signatur

Surf/jobbdator: i7 3770K | GA-Z77-D3H | 16 GB | Intel 510 + 750 GB | HD6870 2GB | 30'' | P180B
Server: Phenom X4 9500 | GA-MA78G-DS3H | 8 GB | 5.4 TB | YY-0221
Speldator: IBM PC XT | 8088 4.77 MHz | 640k | 10 MB HDD | EGA | 360k/720k diskett

Permalänk
Glömsk

Vad du beskriver är en egenhackad key derivation function. Om du vill ha en som kryptonördarna gått igenom noga efter vekheter, så kan du använda http://en.wikipedia.org/wiki/PBKDF2 TrueCrypt använder den med 2000 iterationer (men du kan använda en halv miljon om du vill)

Finns det några vekheter i din? Det tror jag inte, såvida inte det finns någon vekhet i den underliggande hashalgoritmen.

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem

Okej, en halv miljon var kanske lite overkill då. Som jag brukar säga det är bäst att ta i när man ändå ska hålla på
Men jag tyckte att ca en sekund för att generera ett lösenord var ganska lagom, så det var därför det blev en halv miljon ggr.

Jag förstod nog att jag inte var den första att komma på nåt sånt här. Men ändå kul att det var så pass likt, för jag är faktiskt inte alls så insatt att jag hade hört talas om det där tidigare. Men bara inte nån lyckas knäcka nåt så är jag nöjd, om det nu skulle hittas vekheter i SHA512 får man väl göra nåt annat, men jag tror inte det är så stor risk för det.
Jag ser att libtomcrypt har en färdig funktion för PKCS #5 v2.0, pkcs_5_alg2 i fall nån undrar.
Men jag är nog nöjd som det är tror jag, det är som roligare med egna lösningar

Edit: I fall nån är intresserad så har jag lagt upp en windows gui version av programmet här:
http://howisbabbyformed.info/passgen.exe

Visa signatur

Surf/jobbdator: i7 3770K | GA-Z77-D3H | 16 GB | Intel 510 + 750 GB | HD6870 2GB | 30'' | P180B
Server: Phenom X4 9500 | GA-MA78G-DS3H | 8 GB | 5.4 TB | YY-0221
Speldator: IBM PC XT | 8088 4.77 MHz | 640k | 10 MB HDD | EGA | 360k/720k diskett

Permalänk
Citat:

Ursprungligen inskrivet av Psionicist
Vad du beskriver är en egenhackad key derivation function. Om du vill ha en som kryptonördarna gått igenom noga efter vekheter, så kan du använda http://en.wikipedia.org/wiki/PBKDF2 TrueCrypt använder den med 2000 iterationer (men du kan använda en halv miljon om du vill)

Finns det några vekheter i din? Det tror jag inte, såvida inte det finns någon vekhet i den underliggande hashalgoritmen.

Ren nyfikenhet. Har man något krav på hashalgoritmer så att f(f(f(x)))... inte ska gå att optimera?

Eller följer det från andra krav på hashar? Eller brukar det bara bli så?

Permalänk
Glömsk
Citat:

Ursprungligen inskrivet av jop_the_jopsan
Ren nyfikenhet. Har man något krav på hashalgoritmer så att f(f(f(x)))... inte ska gå att optimera?

Eller följer det från andra krav på hashar? Eller brukar det bara bli så?

Kryptografiska hashfunktioner (nästan alla hashfunktioner som är kända, som SHA1, SHA512, MD5 etc är kryptografiska) har inga speciella krav förutom att de ska vara svårt att relatera indata med utdata. Om det skulle finnas någon relation mellan x och f(f(x)) skulle det ses som en svaghet. Detta leder i praktiken att det inte är snabbare eller långsammare att beräkna f(x), f(y) eller f(f(x)). sålänge x, y och f(x) har samma längd.

Det finns en liten konflikt här dock De som utvecklar hashfunktionerna vill ju gärna att dessa ska vara så snabba som möjligt. Prestanda är ofta viktigt, eftersom ingen skulle använda en hash som är för seg. De som utvecklar key derivation-funktionerna (som snq eller de som skapade PBKDF2) vill ju dock slöa ner beräkningstiden. Key derivation-funktionerna designas nästan alltid med nerslöande egenskaper, exempelvis att de inte ska kunna parallelliseras.

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem

Hehe, testade på min slöa jobbdator à 600 Mhz eller 800 Mhz med inputarna "hej" och "hallå", tog ca 10 s

Visa signatur

Stek mer! - Flingor - Schampo
Överklockning är är lika överskattat som din dator är överklockad.

Permalänk

Trevligt program ska nog börja köra med det. Kommer att köra med mitt vanliga lösen + och något ord som jag relaterar till sidan, eller i värsta fall sidans namn.