[英]PRNG not seeded error
我收到一個間歇性錯誤,說在嘗試生成表單身份驗證令牌時沒有播種偽隨機數生成器。 我已經復制了下面的堆棧跟蹤的相關部分。
這就是我知道/看到的: - 重啟乘客似乎暫時解決了問題 - 從控制台運行相同的代碼按預期工作 - / dev / urandom存在所以它應該能夠使用它來播種 - 這發生在ubuntu 10.04上,openssl 0.9.8k,ree 1.8.7 p253,乘客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'
很難過。 任何幫助非常感謝。
假設/dev/random
和/dev/urandom
都是可讀/可寫的並且您仍然遇到此錯誤,那么您是否需要運行/安裝像prngd
這樣的熵生成器?
嘗試:
$ sudo /etc/init.d/prngd start
如果失敗,請先安裝prngd
:
$ sudo apt-get install prngd
一個牽強的假設。 代碼的相關位應該是這樣的(可能這不是相同的版本):
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
我們知道,如果使用少於128位的熵,OpenSSL會給出您報告的錯誤。 總共16個字節(或18..22,如果OpenSSL足夠聰明,可以發現一串ASCII可打印字符並忽略高位)。
初始化OpenSSL的序列類似於,1342652367.A.0.B; 可能有時候,pid足夠小,微秒接近於零,導致的熵低於臨界閾值?
這應該很容易測試:替換
ary.join('.')
同
Digest::MD5.hexdigest(ary.join('.'))
為了確保128位,可能是偶數256位的字符串長度具有合理的不可預測性。
更明確的檢查是添加異常並打印出錯誤被觸發時ary是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.