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;
}
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