Gå til innhold

funksjon for passord generering


Anbefalte innlegg

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 av 516urd
Lenke til kommentar
Videoannonse
Annonse

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 av Jonas
Lenke til kommentar

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

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 av OIS
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...