Mon équipe a reçu un code côté serveur (en Java) qui génère des jetons aléatoires et j'ai une question à ce sujet.
L'objectif de ces jetons est assez sensible : ils sont utilisés pour l'identification de la session, les liens de réinitialisation du mot de passe, etc. Ils doivent donc être cryptographiquement aléatoires pour éviter que quelqu'un ne les devine ou ne les force brutalement. Le jeton est un "long", c'est-à-dire qu'il comporte 64 bits.
Le code utilise actuellement le java.util.Random
pour générer ces jetons. Le site documentation para java.util.Random
stipule clairement ce qui suit :
Les instances de java.util.Random ne sont pas sécurisées sur le plan cryptographique. Pensez plutôt à utiliser SecureRandom pour obtenir un générateur de nombres pseudo-aléatoires sécurisé sur le plan cryptographique pour les applications sensibles à la sécurité.
Cependant, la façon dont le code utilise actuellement java.util.Random
est la suivante : elle instancie le java.security.SecureRandom
et utilise ensuite la classe SecureRandom.nextLong()
afin d'obtenir la graine utilisée pour l'instanciation de l'interface utilisateur. java.util.Random
classe. Ensuite, il utilise java.util.Random.nextLong()
pour générer le jeton.
Donc ma question maintenant - Est-il encore peu sûr étant donné que le java.util.Random
est en cours d'ensemencement en utilisant java.security.SecureRandom
? Dois-je modifier le code de manière à ce qu'il utilise java.security.SecureRandom
exclusivement pour générer les jetons ?
Actuellement, le code qui ensemence le Random
une fois au démarrage
15 votes
Une fois ensemencée, la sortie de java.util.Random est une séquence déterministe de nombres. Ce n'est pas forcément ce que vous voulez.
1 votes
Est-ce que le code ensemence le
Random
une fois au démarrage, ou est-ce qu'il en crée un nouveau pour chaque jeton ? J'espère que c'est une question stupide, mais je voulais vérifier.8 votes
Random n'a qu'un état interne de 48 bits et se répétera après 2^48 appels à nextLong(), ce qui signifie qu'il ne produira pas toutes les valeurs possibles.
long
odouble
valeurs.3 votes
Il y a un autre problème grave. 64 bits signifient 1,84*10^19 combinaisons possibles, ce qui est trop peu pour résister à une attaque sophistiquée. Il existe des machines qui ont craqué un code DES de 56 bits (facteur 256 moins) avec 90*10^9 clés par seconde en 60 heures. Utilisez 128 bits ou deux longueurs !