516urd Skrevet 30. mars 2009 Del Skrevet 30. mars 2009 (endret) Jeg holder på å lage en funksjon som skal generere tilfeldige sikre passord ved hjelp av tegnene a-z, A-Z, 0-9, !, #, ?, &, $, +. Man skal kunne velge passordets lengde og om passordet skal hashes med md5(). Problemet mitt er at jeg er ganske fersk i programmering og kunne derfor trengt noen mer erfarene hjerneceller til å se på funksjonen og forhåpentlig komme med noen tips og kommentarer. En vinkling jeg har tenkt på er at når man kjører koden har man større sansynlihet for å få tegnene !, #, ?, &, $ og +. Er det noen innebygde funksjoner som kan øke sansyneligheten for tall og bokstaver slik at man kan gjøre passordene litt littere å huske. Alle kommentarer og tips mottas med glede. Peace! function pw_generator( $num_chr, $md5 = false ) { $pw = NULL; switch( 1 ) { case 1: for( $i = 0; $i <= $num_chr; $i++ ) { // Chosing rondom ASCII char codes among the chars a-z, A-Z, 0-9, !, #, $, &, + and ? // and placing them in an array $codes = array_merge( range( 97, 122 ), // a letter between a-z range( 48, 57 ), // a number between 0-9 range( 65, 90 ), // a letter between A-Z array( 33, // ! 35, // # 36, // $ 38, // & 43, // + 63 // ? ) // End array() ); // End array_merge() // Randomly choosing one of the codes in array $codes and placing it in $char as an ASCII char $char = chr( $codes[array_rand ( $codes )] ); // Adding the randomly selected char to password $pw .= $char; } // End for() if( !$md5 ) return 'Your password is <b>' . $pw . '</b>'; case 2: // Adding microtime() to generated pw $pw .= microtime(); // Hashing the generated pw with md5() $hashed_string = md5( $pw ); $string_length = strlen( $hashed_string ); // setting the start of the substraction from the hashed string by the length minus // password lenght minus one to ensure the wanted pw lenght $start = rand( 0, ( $string_length - $num_chr - 1 ) ); //lagrer selve passordet $pw = substr( $hashed_string, $start, $num_chr ); return 'Your passord is: <b>' . $pw . '</b>'; } } Edtit: Endret kode med forslaget til Jonas. Takk til Jonas, Endret 30. mars 2009 av 516urd Lenke til kommentar
Jonas Skrevet 30. mars 2009 Del Skrevet 30. mars 2009 (endret) Måten du henter ut tilfeldig tall på gjør at man sjeldent får bokstaver, ja. Se litt på range(). Med denne lager du et array som inneholder hver eneste keykode og fra dette arrayet henter du ut tilfeldige tall. Edit: Heter selvsagt bare range() ... Eksempel: <?php $codes = array_merge ( range ( 97, 122 ), // a letter between a-z range ( 48, 57 ), // a number between 0-9 range ( 65, 90 ), // a letter between A-Z array ( 33, // ! 35, // # 36, // $ 38, // & 43, // + 63 // ? ) ); echo $codes[array_rand ( $codes )]; ?> Endret 30. mars 2009 av Jonas Lenke til kommentar
516urd Skrevet 30. mars 2009 Forfatter Del Skrevet 30. mars 2009 Tusen takk Jonas. Det funka kjempe bra, passordene blir kanskje ikke så mye lettere å huske alltid, men de blir i alle fall mye sikrere når man ikke lengre kan forutse den høye sansyneligheten av de 'spesielle' tegnene. Lenke til kommentar
Terrasque Skrevet 3. april 2009 Del Skrevet 3. april 2009 Et lite tips, $codes array'et bør defineres utenfor for-loopen Lenke til kommentar
OIS Skrevet 4. april 2009 Del Skrevet 4. april 2009 (endret) Det er visse begrensninger i koden din. Og det er ikke vits å generere en random key av bokstaver hvis du skal returnere en hash ... synes hele hash delen av funksjonen burde fjernes. Har også lagt inn at du fjerner noen like bokstaver som I, l, 1 og O, 0. function pw_generator( $num_chr, $md5 = false ) { if ($md5) { $hash = md5(mt_rand()); if ($num_chr === 32) return $hash; $out = ''; if ($num_chr > 32) { for ($i = 0, $t = intval($num_chr / 32); $i < $t; $i++) $out .= pw_generator(32, true); $num_chr = $num_chr % 32; } $out .= substr($hash, 0, $num_chr); return $out; } static $codes; static $count; if (!isset($codes)) { $exclude = array('l', 1, 'I', 0, 'O'); $codes = array_merge ( range ('a', 'z'), range (0, 9), range ('A', 'Z'), array ( '!', '#', '$', '&', '+', '?', ) ); $codes = array_diff($codes, $exclude); $codes = array_flip($codes); $count = ceil(count($codes) / 2); } $password = ''; if ($num_chr > $count) { $t = intval($num_chr / $count); for ($i = 0; $i < $t; $i++) { $password .= pw_generator($count); } $num_chr = $num_chr % $count; } $keys = array_rand($codes, $num_chr); if ($num_chr === 1) $password .= $keys; else $password .= implode('', $keys); return $password; } echo pw_generator(4), "\n"; echo pw_generator(65), "\n"; echo pw_generator(30, true), "\n"; echo pw_generator(32, true), "\n"; echo pw_generator(65, true), "\n"; Endret 4. april 2009 av OIS Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå