首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >UUID.randomUUID()适合用作一次性密码吗?

UUID.randomUUID()适合用作一次性密码吗?
EN

Stack Overflow用户
提问于 2012-06-14 10:57:25
回答 7查看 22.5K关注 0票数 31

作为previous discussed,确认电子邮件在确认链接中应该有一个唯一的、(实际上)不可猜测的代码--本质上是一个one-time password

The UUID.randomUUID() docs说:

使用加密强伪随机数生成器生成UUID。

这是否意味着正确实现的JVM中的UUID随机生成器适合用作唯一的、(实际上)不可猜测的OTP?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2016-10-16 11:50:39

No.根据UUID spec

并不认为UUID很难猜测;例如,它们不应该用作安全功能(仅拥有就可以访问的标识符)。一个可预测的随机数来源将加剧这种情况。

此外,UUID只有16个可能的字符(从0到F)。你可以使用SecureRandom生成一个更紧凑、更安全的随机密码(感谢@erickson)。

代码语言:javascript
复制
import java.security.SecureRandom;
import java.math.BigInteger;

public final class PasswordGenerator {
    private SecureRandom random = new SecureRandom();

    public String nextPassword() {
        return new BigInteger(130, random).toString(32);
    }
}

附注:

我想给出一个清楚的例子,说明使用UUID作为安全令牌可能会导致问题:

uuid-random中,我们通过巧妙地在内部重用随机字节发现了an enormous speed-boost,从而产生了可预测的UUID。虽然我们没有发布更改,但RFC允许这样做,这样的优化可能会偷偷进入您的UUID库而不被注意到。

票数 17
EN

Stack Overflow用户

发布于 2012-06-14 11:17:50

如果你阅读定义UUID的RFC,你会发现UUID并非所有的位都是随机的(“变量”和“版本”不是随机的)。因此,如果正确实现类型4UUID(您打算使用的类型),那么在128位的总大小中,应该有122位(对于此实现来说是安全的)随机信息。

所以,是的,它将会像一个来自“安全”生成器的122位随机数一样工作。但较短的值可能包含足够的随机性,并且对用户来说可能更容易(也许我是唯一一个仍然在终端中阅读电子邮件的老式用户,但跨行换行的确认URL很烦人……)。

票数 19
EN

Stack Overflow用户

发布于 2012-06-14 12:19:09

是的,使用java.util.UUID是很好的,randomUUID方法是从加密的secure源生成的。没有什么需要说的了。

这是我的建议:

  1. 向用户发送一个包含大量密码的链接作为URL参数。
  2. 当用户单击该链接时,编写您的后端,以便它将确定该参数是否正确以及用户是否已登录。
  3. 在发出UUID 24小时后使其无效。

这将需要一些工作,但如果您真的关心编写一个健壮、安全的系统,那么这是必要的。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11026061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档