Mahtaisikohan php:llä saada nopeasti salasanan luotua (tyyliin seitsemän merkkiä, ei skandeja jne.). Mun pitäisi luoda n. 100 salasanaa eikä niitä jaksa itse keksiä..
Pikaisella googletuksella löytyi esimerkiksi tämä sivu: http://www.laughing-buddha.net/jon/php/password/
md5(time()); ja tuosta leikkelet sopivan pituisen.
md5(time()); voi olla ongelmallinen seuraavalla tavalla:
<?php $alku=mktime(12,20,0,9,12,2005); $loppu=mktime(12,25,0,9,12,2005); $määrä=$loppu-$alku; //testiosuus alkaa $yht=''; print 'Mahdollisia salasanoja viiden minuutin aikana on '.$määrä.' kappaletta ja ne ovat <br>'; for($alku; $alku<=$loppu; $alku++){ $salasana=substr(md5($alku),0,7); print $salasana."<br>"; $yht.=$salasana; } $merkit=count_chars($yht, 1); print'<p>Merkkien variaatio salasanoissa. Taulukossa merkkien tavuarvot. Käytettyjen merkkien lukumäärä '.count($merkit).'</p> <pre>'; print_r($merkit); print '</pre> <p>Ja sitten vielä merkkien ymmärettävämmät muodot</p>'; foreach($merkit as $merkki =>$kpl){ print'Merkkiä '. chr($merkki). ' ' .$kpl. ' kappaletta <br>'; } ?>
Kuten tuosta huomataan käyttöön tulee vain 16 erilaista merkkiä. Aikavälin kasvattaminen 5 päivään ei tee asiaan muutosta.
Jon Haworthin funktio on tässä suhteessa parempi. Sillä saadaan varmemmin vaihtelua salasanoihin. Varsinkin jos otetaan mukaan myös isot kirjaimet. Huomasittehan, että mm. e, l ja o puuttuivat käytettävissä olevista merkeistä? Tämä on varmaankin varotoimi liian samannäköisten merkkien osumisesta salasanaan.
[edit: korjasin salasanan pituuden 7 merkkiin]
Entäpäs jos käyttää time:n sijaan microtimeä?
<?php function SatunnainenMerkkijono ($merkkimaara) { $merkit = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz023456789-_"; srand((double)microtime()*1000000); $merkkijono = ""; for($i=0;$i<$merkkimaara;$i++) { $numero = rand() % strlen($merkit); $tilapainen = substr($merkit, $numero, 1); $merkkijono .= $tilapainen; } return $merkkijono; } echo "</pre>"; for ($i=0;$i<101;$i++) { echo SatunnainenMerkkijono(7) . "\n"; } echo "</pre>"; ?>
Jos ei toimi niin ainakin pohja valmiina, eikä kannata tottua täyteen palveluun, sattumoisin oli valmis funktio ja selittäminen olisi kestänyt pidempään *grin*
<?php function MakeRandomPassword($length=4) { $_vowels = array ('a', 'e', 'i', 'o', 'u'); $_consonants = array ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'b', 'c', 'd', 'f', 'g', 'h', 'k', 'm', 'n','p', 'r', 's', 't', 'v', 'w', 'x', 'z'); $_syllables = array (); foreach ($_vowels as $v) { foreach ($_consonants as $c) { array_push($_syllables,"$c$v"); array_push($_syllables,"$v$c"); } } for ( $i=0;$i<=($length/2);$i++) $newpass=$newpass.$_syllables[array_rand($_syllables)]; return $newpass; } ?>
Alunperin jostakin kopioitu (PHP manuaali?) ja vähän muokattu. Ei mikään paras mutta eräässä vähemmän julkisessa/tärkeässä projektissa käytetty.
Edit: Sikäli huono että ainoastaan lowercase tapaukset. Tosin voihan siihen jotain strtoupperia sotkea, tai vain laittaa taulukoihin isojakin kirjaimia...
Hirveätä prosessointiajan tuhlausta tuo. Tuo syllables-taulukko pitäisi määritellä suoraan sivun alussa ja tuoda funktiolle tyyliin global $_syllables; (puuh, näkyvyysalueita kehiin). Nyt se määritellään uudestaan aina, kun tahdotaan luoda salasana. Ja muutenkin length 4 on vähän turhan pieni defaultiksi. Ja $newpass.=..
Meitsi kirjoitti:
Entäpäs jos käyttää time:n sijaan microtimeä?
Sillä ei ole vaikutusta, koska microtime() palauttaa aivan vastaavanlaisen luvun kuin time(). Se koostuu aina korkeintaan 10 erilaisesta merkistä. Pätkäistäänpä kummasta tahansa mistä kohdasta tahansa 7 merkin mittainen pätkä, ovat ne silti lähes samat. Maksimimäärä tuollaisille pätkille on 1000000. (0000000 -- 9999999)
Haworthin funktiossa lisättynä ISOILLA kirjaimilla on 50 (jos laskin kirjainten määrän oikein) eri merkkiä, joista salasana muodostetaan. Joku joka osaa laskea todennäköisyyksiä heittää pian mikä on todennäköisyys saada 7 oikein 50:stä ja samalla myös sen määrän, mitä erilaisia merkkijonoja voi tuosta muodostaa.
Kiitoksia, sain asian tehtyä!
Aihe on jo aika vanha, joten et voi enää vastata siihen.