Étape 12 : SparkRandomNumberGenerator
Comme indiqué dans l’étape précédente, le noyau de l’étincelle doit avoir la capacité de générer des vecteurs d’initialisation aléatoire et de défi Nonces. Cela nécessite un algorithme PRNG (Générateur de nombres pseudo-aléatoires). Heureusement, il existe rand48 fonction de libc.
Toutefois, un PRNG doit être ensemencé avec une graine aléatoire. Il est très important pour cette graine être imprévisible et non répétitif sur un délai raisonnable. Si l’attaquant peut prédire notre postérité, ils peuvent prédire nos nombres aléatoires, ce qui signifie aussi qu’ils peuvent comprendre notre défi Nonces et des vecteurs d’initialisation.
Par exemple, si nous utilisons toujours la même graine pour inaugurer notre PRNG, puis tout l’attaquant doit faire est capture n’importe quel message crypté et puis forcer notre étincelle pour redémarrer. Après que l’attaquant simplement relit le message capturé, jusqu'à ce que l’étincelle frappe le même nombre aléatoire comme a été utilisée pour construire le message enregistré, et nous sommes piratés.
L’utilisation de plus d’une graine ne résout pas le problème, b/c la même attaque décrite ci-dessus encore en travaux, si l’attaquant a la possibilité de redémarrer continuellement l’étincelle comme autant de fois qu’il y a des graines pré-calculée.
C’est pourquoi nous devons toujours mélanger nos graines pré-calculée avec une véritable source d’entropie. C’est facile de trop sur un grand ordinateur complex, mais le noyau de l’étincelle, c’est trop simple d’avoir une vraie entropie dans sa propre mémoire, donc l’entropie doit provenir d’une source externe.
Il y a dédié dispositifs qui peut fournir cette entropie en amplifiant le bruit quantique dans une jonction semi-conductrice biaisée inverse ou dédiées jetons de sécurité, mais ce serait exagéré pour ce projet.
Au lieu de cela, nous pouvons utiliser l’entropie inhérente à la vitesse avec laquelle les paquets se déplacent sur un réseau, ainsi qu’à l’aide de l’entropie du temps quand une demande est en précession.
Algorithme de
Ainsi, l’algorithme utilisé par SparkRandomNumberGenerator pour générer un nombre aléatoire est comme suit :
L’entropie utilisée pour l’ensemencement de la fonction PRNG (seed48) est mélangé ensemble de 3 sources différentes :
- rand48 est ensemencé avec une de 65536 pré-calculée graines de 48 bits, stockés dans un Flash externe. Chaque fois que le redémarrage de l’étincelle, la prochaine semence est utilisée. La rotation de la graine peut être désactivée en commentant ROTATE_SEED en SparkRandomNumberGenerator.h: 35.
- Un serveur de réseau spécifié est ping 5 fois (valeur par défaut est 8.8.8.8). Chaque fois que ping est utilisé comme un tour de HMAC (Ludivine, ping_time). Les premiers 128 bits de HMAC qui en résulte est notre entropie supplémentaire fonction XOR avec chaque appel à rand48. Entropie de réseau rassemblant stade est ce qui est responsable d’un retard assez longs à la première demande au noyau étincelle après qu’il démarre. Pour désactiver cette scène commentez PING_TEST_SERVER en SparkRandomNumberGenerator.h: 34.
- Le nombre aléatoire généré de 128 bits est la fonction XOR avec premières 128 bits du HMAC (Ludivine, Current_Timestamp). Donc le temps au cours de laquelle le nombre aléatoire a été demandé est utilisé pour l’entropie supplémentaire.
Tout ce que nous devons faire maintenant est de stocker les graines pré-calculée dans un Flash externe. Voir les prochaines étapes.