Is UUID.randomUUID() suitable for use as a one-time password?

前端 未结 7 1269
夕颜
夕颜 2020-12-25 11:49

As previous discussed, confirmation emails should have a unique, (practically) un-guessable code--essentially a one-time password--in the confirmation link.

The UUI

相关标签:
7条回答
  • 2020-12-25 12:19

    The point of the random code for a confirmation link is that the attacker should not be able to guess nor predict the value. As you can see, to find the correct code to your confirmation link, a 128bits length UUID yields 2^128 different possible codes, namely, 340,282,366,920,938,463,463,374,607,431,768,211,456 possible codes to try. I think your confirmation link is not for launching a nuclear weapon, right? This is difficult enough for attacker to guess. It's secure.

    -- update --

    If you don't trust the cryptographically strong random number generator provided, you can put some more unpredictable parameters with the UUID code and hash them. For example,

    code = SHA1(UUID, Process PID, Thread ID, Local connection port number, CPU temperature)

    This make it even harder to predict.

    0 讨论(0)
  • 2020-12-25 12:22

    if you read the RFC that defines UUIDs, and which is linked to from the API docs, you'll see that not all bits of the UUID are actually random (the "variant" and the "version" are not random). so a type 4 UUID (the kind that you intend to use), if implemented correctly, should have 122 bits of (secure, for this implementation) random information, out of a total size of 128 bits.

    so yes, it will work as well as a 122 bit random number from a "secure" generator. but a shorter value may contain a sufficient amount of randomness and might be easier for a user (maybe i am the only old-fashioned person who still reads email in a terminal, but confirmation URLs that wrap across lines are annoying....).

    0 讨论(0)
  • 2020-12-25 12:30

    I think java.util.UUID should be fine. You can find more information from this article:

    0 讨论(0)
  • 2020-12-25 12:36

    I think this should be suitable, as it is generated randomly rather than from any specific input (ie you're not feeding it with a username or something like that) - so multiple calls to this code will give different results. It states that its a 128-bit key, so its long enough to be impractical to break.

    Are you then going to use this key to encrypt a value, or are you expecting to use this as the actual password? Regardless, you'll need to re-interpret the key into a format that can be entered by a keyboard. For example, do a Base64 or Hex conversion, or somehow map the values to alpha-numerics, otherwise the user will be trying to enter byte values that don't exist on the keyboard.

    0 讨论(0)
  • 2020-12-25 12:39

    Yes, using a java.util.UUID is fine, randomUUID methods generates from a cryptographically secure source. There's not much more that needs to be said.

    Here's my suggestion:

    1. Send the user a link with a huge password in it as the URL argument.
    2. When user clicks the link, write your backend so that it will determine whether or not the argument is correct and that the user is logged in.
    3. Invalidate the UUID 24 hours after it has been issued.

    This will take some work, but it's necessary if you really care about writing a robust, secure system.

    0 讨论(0)
  • 2020-12-25 12:39

    It is perfect as one time password, as even I had implemented the same for application on which am working. Moreover, the link which you've shared says it all.

    0 讨论(0)
提交回复
热议问题