Are Java random UUID's predictable?

后端 未结 3 2160
野性不改
野性不改 2020-12-09 07:27

I would like to use a cryptographically secure primary key for sensitive data in a database - this cannot be guessable/predictable and it cannot be generated by the database

3条回答
  •  孤街浪徒
    2020-12-09 08:14

    Well if you want to know how random a UUID is you have to look onto the source.

    The following code section is taken from OpenJDK7 (and it is identical in 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);
        }
    

    As you can see only 2 of 16 bytes are not completely random. In the sixth byte you lose 4 of 8 bits and on byte 8 you loose 2 bits of randomness.

    Therefore you will get an 128 bit value with 122 bit randomness.

    The only problem that may arise from the manipulation is that with a high chance your data can be identified as an UUID. Therefore if you want to hide it in other random data this will not work...

提交回复
热议问题