Stap 12: SparkRandomNumberGenerator
Zoals besproken in de vorige stap, moet de kern van de vonk de mogelijkheid hebben om willekeurige initialisatie vectoren en uitdaging Nonces te genereren. Dit vereist een PRNG (pseudo-willekeurige nummer generator) algoritme. Gelukkig is rand48 functie beschikbaar in libc.
Een PRNG moet echter worden bezaaid met een willekeurige zaad. Het is zeer belangrijk voor dit zaad om onvoorspelbaar en niet-herhalende over een redelijke termijn. Als de aanvaller ons nageslacht voorspellen kan, kunnen zij onze willekeurige getallen, dat ook betekent dat zij onze uitdaging Nonces en initialisatie vectoren uitzoeken kunnen voorspellen.
Bijvoorbeeld, als aftrap van onze PRNG gebruiken wij altijd de dezelfde zaad, dan allen de aanvaller moet doen is vangen een gecodeerd bericht, en vervolgens dwingen onze vonk opnieuw op te starten. Na dat de aanvaller gewoon replays het opgenomen bericht, totdat de vonk hits willekeurige evenveel als werd gebruikt voor de bouw van de opgenomen bericht, en we zijn gehackt.
Het gebruik van meer dan één zaad lost niet het probleem, b/c dezelfde aanval beschreven boven nog steeds werkt, als de aanvaller het vermogen heeft om voortdurend opnieuw opstarten van de vonk zoveel maal als er vooraf berekende zaden zijn.
Dit is waarom we altijd onze vooraf berekende zaden met een ware bron van entropie mengen moeten. Dat is makkelijk genoeg op een grote complexe computer, maar de kern van de vonk is ook eenvoudig te hebben echte entropie in zijn eigen geheugen, dus de entropie moet afkomstig zijn uit een externe bron.
Er zijn speciale apparaten die deze entropie kan leveren door het quantum lawaai in een omgekeerde vooringenomen halfgeleider junction, of dedicated security chipsfrequentiebanden te versterken, maar dat zou overkill voor dit project.
In plaats daarvan kunnen we de entropie die inherent zijn aan de snelheid waarmee pakketten Beweeg over een netwerk, alsmede met behulp van de entropie van de tijd wanneer een verzoek is die hoeveelheid gebruiken.
Algoritme
Dus, het algoritme gebruikt door de SparkRandomNumberGenerator voor het genereren van een willekeurig getal is als volgt:
De entropie gebruikt voor het zaaien van de PRNG functie (seed48) is van 3 verschillende bronnen vermengd:
- rand48 is bezaaid met een van 65536 vooraf berekende 48-bits zaden, opgeslagen in de externe flitser. Elke keer als de vonk opnieuw wordt opgestart, wordt het volgende zaad wordt gebruikt. De rotatie van het zaad kan worden uitgeschakeld door commentaar uit ROTATE_SEED in SparkRandomNumberGenerator.h: 35.
- Een opgegeven netwerkserver is pinged 5 keer (standaard is 8.8.8.8). Telkens als ping wordt gebruikt als een ronde van HMAC (Master_Key, ping_time). De eerste 128 bits van de resulterende HMAC is onze extra entropie XORed met elke oproep tot rand48. Netwerk entropie verzamelen fase is wat is verantwoordelijk voor een vrij lange vertraging op eerste verzoek aan de Spark-kern nadat het laarzen. Uitschakelen van deze fase commentaar uit PING_TEST_SERVER in SparkRandomNumberGenerator.h: 34.
- De gegenereerde 128-bits getal is XORed met de eerste 128 bits van HMAC (Master_key, Current_Timestamp). Dus het tijdstip waartegen de willekeurig getal was aangevraagd wordt gebruikt voor extra entropie.
Nu is allen wij moeten doen de vooraf berekende zaden worden opgeslagen in de externe flitser. Zie de volgende stappen.