Python - Generere random tall
Python random module:
I forbindelse med et kurs som jeg har holdt hadde vi en oppgave der vi skulle skrive et program som simulerte terningkast. For å få til dette brukte vi modulen random.
import random
def kast_terning(antall_kast):
for i in range(0, antall_kast):
print(random.randrange(1,7))
kast_terning(10)
Denne tilnærmingen fungerer, men det som er viktig er at modulenrandom ikke må brukes til å generere hemmeligheter i en sikkerhet/kryptografisk kontekst.
I webinaret brukte vi altså random modulen for å simulere et terningkast:
>>> import random
>>> random.randrange(1, 7)
1
Den innebygde random modulen er en såkalt pseudo-random number generator (prng) som blant annet kan brukes til å generere en rekke med tilfeldige tall. For å generere disse tilfeldige tallene bruker modulen en algoritme (Mersenne Twister) som v.h.a matematiske funksjoner genererer et sett med tall. Denne algoritmen bruker en startverdi (seed) som kalkuleringene baserer seg på, og om man bruker samme seed, får man det samme resultatet.
>>> import random
>>> random.seed(5)
>>> random.random()
0.6229016948897019
>>> random.random()
0.7417869892607294
>>> random.random()
0.7951935655656966
>>> random.seed(5)
>>> random.random()
0.6229016948897019
>>>
Som vi ser i eksempelet her får vi samme resultatet begge gangene når vi eksplisitt setter seed til 5. Om du prøver dette på din egen maskin, og setter seed til 5, vil du få nøyaktig samme resultatet som jeg viser her. Om vi ikke setter seed spesifikt vil algoritmen bruke gjeldende systemtid. Dette betyr at dersom noen vet når du genererte hemmeligheten din ved hjelp av modulen random, så kan de gjenskape hemmeligheten ved å overstyre seed.
Det at noen kan gjenskape hemmeligheten din på denne måten betyr at vi ikke kan lene oss til den innebygde random modulen for å generere sikre koder.
Heldigvis kommer python med minst en innebygd løsning som vi kan bruke istedenfor, nemlig modulen secrets.
Så om vi vil simulere terningkast på en kryptografisk sikrere måte en vi gjorde på webinaret kan vi gjøre følgende:
zsh:::
>>> import secrets
>>> secure_generator = secrets.SystemRandom()
>>> secure_generator.randrange(1, 7)
2
Så det var veldig kort «Hvordan generere tall i python på en sikker måte».
Referanser
https://docs.python.org/3/library/random.html