Les UUID aléatoires de Java sont-ils prévisibles?

Je voudrais utiliser une clé primaire sécurisée cryptographiquement pour les données sensibles dans une firebase database – cela ne peut pas être deviné / prévisible et ne peut pas être généré par la firebase database (j’ai besoin de la clé avant que l’object soit persisté).

Je comprends que Java utilise un UUID de type 4 avec un générateur de nombres aléatoires sécurisé sur le plan cryptographique, mais je sais que l’UUID n’est pas complètement aléatoire, alors ma question est de savoir si les uuids ne peuvent pas être prédits

Eh bien, si vous voulez savoir à quel point un UUID est aléatoire, vous devez regarder la source.

La section de code suivante est extraite d’ OpenJDK7 (et elle est identique dans OpenJDK6 ):

 public static UUID randomUUID() { SecureRandom ng = numberGenerator; if (ng == null) { numberGenerator = ng = new SecureRandom(); } byte[] randomBytes = new byte[16]; ng.nextBytes(randomBytes); randomBytes[6] &= 0x0f; /* clear version */ randomBytes[6] |= 0x40; /* set to version 4 */ randomBytes[8] &= 0x3f; /* clear variant */ randomBytes[8] |= 0x80; /* set to IETF variant */ return new UUID(randomBytes); } 

Comme vous pouvez le voir, seuls 2 octets sur 16 ne sont pas complètement aléatoires. Au sixième octet, vous perdez 4 bits sur 8 et à l’octet 8 vous perdez 2 bits de hasard.

Par conséquent, vous obtiendrez une valeur de 128 bits avec un caractère aléatoire de 122 bits.

Le seul problème qui peut découler de la manipulation est que, avec de fortes chances que vos données puissent être identifiées comme un UUID. Par conséquent, si vous voulez le cacher dans d’autres données aléatoires, cela ne fonctionnera pas …

Si vous souhaitez générer une clé aléatoire sécurisée, je vous suggère d’utiliser SecureRandom. Cela peut générer une clé de n’importe quel nombre de bits dont vous avez besoin. C’est plus lent que aléatoire, mais beaucoup plus sûr.

J’ai toujours pensé que le «générateur de nombres aléatoires cryptographiquement sécurisé» (en fait «générateur de nombres pseudo-aléatoires cryptographiquement fort») note Javadoc répond à cette question.

http://download.oracle.com/javase/1,5.0/docs/api/java/util/UUID.html#randomUUID ()

De ce que Wikipedia dit http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator une telle prédiction serait un algorithme non polynomial.

Si vous avez vraiment besoin de quelque chose de «pseudo» aléatoire, vous devez utiliser quelque chose d’extérieur, un générateur de bruit matériel, des points aléatoires générés après avoir déplacé une souris, …

EntropyPool semble aider à cela, pas encore essayé http://random.hd.org/ Comme je le comprends, il vous permet de télécharger du bruit réel et de l’utiliser dans votre application Java. Il n’est pas connecté à java.util.UUID api, cependant, pourrait probablement être branché à l’aide de la méthode nameUUIDFromBytes (ou autre?).

Ce serait cool si vous nous faites savoir comment vous avez décidé d’aller.