Kirjautuminen

Haku

Tehtävät

Koodit: PHP: Vahva satunnaisuus

Kirjoittaja: Metabolix

Kirjoitettu: 07.09.2015 – 07.09.2015

Tagit: ohjelmointitavat, tietoturva, 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ää.

Funktiot

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

Virhetilanteet

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ä.

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta