2012-07-08 169 views
3

我收到一個間歇性錯誤,說當試圖生成表單身份驗證令牌時,沒有播種僞隨機數生成器。我已經複製了以下堆棧跟蹤的相關部分。PRNG沒有播種錯誤

這裏就是我知道/看: - 重啓乘客似乎暫時解決這個問題 - 運行從控制檯相同的代碼按預期工作 - 的/ dev/urandom的存在,所以它應該是能夠使用該種子 - 這發生在Ubuntu 10.04上,使用openssl 0.9.8k,ree 1.8.7 p253和passenger 3.0.3。 - 我讀過關於獨角獸的一個問題,聽起來就像重新啓動工人時發生的那樣,但沒有看到乘客上描述的那種東西。

SessionsController#new (ActionView::TemplateError) "PRNG not seeded" 
/usr/local/lib/ruby/1.8/securerandom.rb:53:in `random_bytes' 
/usr/local/lib/ruby/1.8/securerandom.rb:53:in `random_bytes' 
/usr/local/lib/ruby/1.8/securerandom.rb:105:in `base64' 
vendor/bundle/ruby/1.8/gems/actionpack-2.3.14/lib/action_controller/request_forgery_protection.rb:109:in `form_authenticity_token' 
(eval):2:in `send' 
(eval):2:in `form_authenticity_token' 

相當難倒。任何幫助不勝感激。

+0

什麼操作系統?難道'SecureRandom'沒有足夠的熵? – Linuxios 2012-07-08 13:33:28

+0

看起來像Ubuntu 10.04。 – 2012-07-09 00:23:07

+0

我應該尋找什麼跡象來確定它是否沒有足夠的熵?我不認爲這會是一個問題,因爲openssh的版本使用/ dev/urandom,但我不是這方面的專家。 – hubert 2012-07-10 09:50:40

回答

0

假設都/dev/random/dev/urandom讀/寫的,但您仍然收到此錯誤,也許你需要運行/安裝熵產生像prngd

嘗試:

$ sudo /etc/init.d/prngd start 

,如果失敗,安裝prngd第一:

$ sudo apt-get install prngd 
0

牽強的假說。代碼的相關位應該是這樣的(可能這是不一樣的版本):

def self.random_bytes(n=nil) 
    n ||= 16 
    if defined? OpenSSL::Random 
    @pid = 0 if !defined?(@pid) 
    pid = $$ 
    if @pid != pid 
     now = Time.now 
     ary = [now.to_i, now.usec, @pid, pid] 
     OpenSSL::Random.seed(ary.join('.')) 
     @pid = pid 
    end 
    return OpenSSL::Random.random_bytes(n) 
end 

,我們知道OpenSSL的給你報告,如果飼餵熵少於128位的錯誤。它總共是16個字節(或者18..22,如果OpenSSL足夠聰明,可以識別一串ASCII可打印字符並忽略高位)。

初始化OpenSSL的序列類似於1342652367.A.0.B;有時可能有可能pid足夠小,並且微秒接近零,結果熵降至臨界閾值以下?

這應該是很容易測試:爲了與

Digest::MD5.hexdigest(ary.join('.')) 

更換

ary.join('.') 

有一定-128位,可能是偶數256位串合理的不可預測的長度。

更確定的檢查是添加一個異常並打印錯誤觸發時的ary。