作为previous discussed,确认电子邮件在确认链接中应该有一个唯一的、(实际上)不可猜测的代码--本质上是一个one-time password。
使用加密强伪随机数生成器生成UUID。
这是否意味着正确实现的JVM中的UUID随机生成器适合用作唯一的、(实际上)不可猜测的OTP?
发布于 2016-10-16 11:50:39
No.根据UUID spec的
并不认为UUID很难猜测;例如,它们不应该用作安全功能(仅拥有就可以访问的标识符)。一个可预测的随机数来源将加剧这种情况。
此外,UUID只有16个可能的字符(从0到F)。你可以使用SecureRandom
生成一个更紧凑、更安全的随机密码(感谢@erickson)。
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库而不被注意到。
发布于 2012-06-14 11:17:50
如果你阅读定义UUID的RFC,你会发现UUID并非所有的位都是随机的(“变量”和“版本”不是随机的)。因此,如果正确实现类型4UUID(您打算使用的类型),那么在128位的总大小中,应该有122位(对于此实现来说是安全的)随机信息。
所以,是的,它将会像一个来自“安全”生成器的122位随机数一样工作。但较短的值可能包含足够的随机性,并且对用户来说可能更容易(也许我是唯一一个仍然在终端中阅读电子邮件的老式用户,但跨行换行的确认URL很烦人……)。
发布于 2012-06-14 12:19:09
是的,使用java.util.UUID
是很好的,randomUUID
方法是从加密的secure源生成的。没有什么需要说的了。
这是我的建议:
这将需要一些工作,但如果您真的关心编写一个健壮、安全的系统,那么这是必要的。
https://stackoverflow.com/questions/11026061
复制相似问题