Kirjoittaja: Metabolix
Kirjoitettu: 07.09.2015 – 07.09.2015
Tagit: ohjelmointitavat, tietoturva, koodi näytille, vinkki
PHP:hen on vihdoin lisätty helpot funktiot vahvan satunnaisdatan tuottamiseen: random_bytes ja random_int. Uudet funktiot tuottavat vahvaa pseudosatunnaisuutta – toisin kuin heikot funktiot rand ja mt_rand – ja toisaalta toimivat järjestelmästä toiseen ilman mitään PHP:n lisäosia.
Uudet funktiot ovat mukana PHP:n versiosta 7.0 alkaen. Vanhempiin versioihin ne voi ladata GitHubista ja liittää mukaan include-komennolla.
Vahvaa satunnaisuutta ei toki kannata käyttää turhaan, koska generointi on hitaampaa kuin heikon satunnaisuuden generointi. Esimerkiksi graafiset efektit ja viikon kysymyksen arvonta eivät vaadi vahvaa satunnaisuutta. Sen sijaan salauksessa ja muussa tietoturvassa vahva satunnaisuus on tärkeää.
Satunnaista binääridataa voi arpoa funktiolla random_bytes.
<?php $data = random_bytes(15); $salasana = base64_encode($data); // 15 tavua -> 20 merkkiä echo "Salasanageneraattori loi salasanan {$salasana}.\n"; $avain = random_bytes(512); $avain_b64 = chunk_split(base64_encode($avain), 76, "\n"); echo "Salainen avaimesi:\n{$avain_b64}\n";
Satunnaisen kokonaisluvun voi arpoa funktiolla random_int.
<?php $luku = random_int(1, 6); echo "Arpakuutio antoi luvun {$luku}.\n"; $luku = random_int(1, 4) + random_int(1, 4); echo "Soturin äpärämiekka (2D4) osui voimalla {$luku}.\n"; $pin = substr(strval(random_int(10000, 19999)), 1, 4); echo "PIN-koodisi on {$pin}.\n";
Voi olla, että palvelin on konfiguroitu väärin ja PHP ei pysty tuottamaan laadukasta satunnaisuutta, jolloin funktiot heittävät poikkeuksen. Yleensä silloin on syytä keskeyttää vahvaa satunnaisuutta vaativa toiminto ja näyttää käyttäjälle virheilmoitus.
try { $data = random_bytes(15); $salasana = base64_encode($data); // 15 tavua -> 20 merkkiä echo "Salasanageneraattori loi salasanan {$salasana}.\n"; } catch (Exception $e) { echo "Salasanageneraattori ei juuri nyt toimi.\n"; }
Virhe aiheutuu tietenkin myös, jos funktiolle annetaan väärä parametri, esimerkiksi tekstiä tai olioita tai negatiivinen datamäärä.