Spark Core och Android Garage öppnare. Minus Spark molnet. (12 / 19 steg)
Steg 12: SparkRandomNumberGenerator
Som diskuterades i föregående steg, måste Spark kärnan ha förmågan att generera slumpmässiga initiering vektorer och utmaning Nonces. Detta kräver en PRNG (Pseudorandom number generator) algoritm. Lyckligtvis är rand48 funktionen tillgänglig i libc.
Dock måste en PRNG ympats med en slumptalsfrö. Det är mycket viktigt för detta utsäde vara oförutsägbara och icke upprepande över en rimlig tidsperiod. Om angriparen kan förutsäga våra avkomlingar, kan de förutsäga våra slumptal, vilket också innebär att de kan lista ut vår utmaning Nonces och initiering vektorer.
Till exempel om vi använder alltid samma frö för att sparka igång våra PRNG, sedan alla angriparen har att göra är fånga alla krypterade meddelanden, och sedan tvinga våra Spark till pånyttfödd. Efter att angriparen bara repriser fångade meddelandet, tills gnistan träffar samma slumptal som användes för att konstruera det inspelade meddelandet, och vi är hackat.
Användningen av mer än ett frö löser inte problemet, b/c samma attacken beskrivs ovan fungerar fortfarande, om angriparen har förmågan att ständigt pånyttfödd gnistan så många gånger som det finns före beräknad frön.
Det är därför vi måste alltid blanda våra pre beräknade frön med några verkliga källan av entropi. Det är lätt nog på en stor komplex dator, men Spark kärnan är för enkelt att ha några verkliga entropi i sitt eget minne, så entropin måste komma från en extern källa.
Det finns särskilda enheter som kan leverera detta entropi av förstärkande quantum buller i en omvänd partisk semiconductor junction, eller dedikerad säkerhet marker, men det skulle vara overkill för detta projekt.
Istället kan vi använda entropi inneboende till den hastighet som paket flytta över ett nätverk som med tiden när en begäran är att vara Precesserade entropi.
Algoritm
Så, den algoritm som används av SparkRandomNumberGenerator för att generera ett slumptal är följande:
Entropin används för sådd funktionen PRNG (seed48) blandas ihop från 3 olika källor:
- rand48 är seedade med en av 65536 före beräknad 48-bitars frön, lagras i extern blixt. Varje gång gnistan startar, används det nästa utsädet. Utsäde rotation kan stängas av genom att kommentera ut ROTATE_SEED i SparkRandomNumberGenerator.h: 35.
- En angiven nätverksserver är pingade 5 gånger (standard är 8.8.8.8). Varje ping tid används som en omgång HMAC (Master_Key, ping_time). De första 128 bitarna av den resulterande HMAC är våra ytterligare entropi XORed med varje anrop till rand48. Nätverket entropi insamling etappen är vad är ansvarig för en lång fördröjning på den första begäran till Spark kärnan efter det stövlar. Inaktivera detta skede kommentera bort PING_TEST_SERVER i SparkRandomNumberGenerator.h: 34.
- 128-bitars genererade slumptal är XORed med första 128 bitar av HMAC (Master_key, Current_Timestamp). Så används den tid vid vilken slumptal begärdes för ytterligare entropi.
Allt vi behöver göra nu är lagra före beräknad fröna i externa Flash. Se nästa steg.