2009-07-25 74 views
4

在Linux上,我习惯于使用mkpasswd来生成在OS X上使用的随机密码,但是我没有这个命令。我不想每次都打开我的vps,而是想用Java重新实现它。我所做的是随机挑选4个小写字母,2个大写字母,2个符号(/等等)和2个数字。然后我创建一个向量并洗牌。重新实现mkpasswd

您认为这是足够好的随机性吗?

回答

1

是的。如果您使用java.util.Random

该类的一个实例用于生成伪随机数字流。该类使用48位种子,使用线性同余公式进行修改。 (见Donald Knuth,计算机编程艺术,第2卷,第3.2.1节。)

由类Random实现的算法使用受保护的实用程序方法,每个调用可以提供多达32个伪随机生成的位。

编辑

响应评论:

/** 
* Creates a new random number generator. This constructor sets 
* the seed of the random number generator to a value very likely 
* to be distinct from any other invocation of this constructor. 
*/ 
public Random() { 
    this(++seedUniquifier + System.nanoTime()); 
} 

private static volatile long seedUniquifier = 8682522807148012L; 
+0

种子从哪里来? :) – Inshallah 2009-07-25 08:10:12

+1

可能没有任何冲突,但不能保证安全。如果有人可以猜测System.nanoTime()的价值,那么在生成器正在播种时,他很可能会找出生成的密码。这是一个真正的问题;我不认为你可以像使用java.util.Random那样使用java.util.Random,你必须从更加不可预知的来源(例如/ dev/random)获取你的种子。 – Inshallah 2009-07-25 08:32:25

+0

你是对的:-) – dfa 2009-07-25 08:53:57

0

取决于你的熵来自哪里。使用rand()或类似的函数,您的特定语言可能不安全。

在OSX上,您可以使用/ dev/random我认为。

0

这可能是好的,但是你应该考虑在某些密码长度随机也许。

如果您的程序开始流行,那么密码长度就会成为公共知识的弱点。还要随机确定小写:大写:符号:数字的确切比例。

+0

我会随机化那些现在我只是复制什么mkpasswd没有任何选项产生。 – 2009-07-25 08:26:17

0

为什么不在你的OS X主机上编译mkpasswd?

1

Mac Ports中有类似的pwgen命令可用。

3

如果您使用java.security.SecureRandom而不是java.util.Random,那么它可能是安全的。 SecureRandom提供了“密码强的伪随机数发生器(PRNG)”。即它确保种子不容易被猜测,并且所产生的数字具有高熵。

+0

我在某处挖掘出来的......让SecureRandom种子本身从它自己的内部随机源中获得。默认情况下,它被配置为Mac OS X上的设备/ dev/random。 – Inshallah 2009-07-25 09:18:24