2009-07-25 76 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