4

フォーム認証トークンを生成しようとすると、疑似乱数ジェネレーターがシードされていないという断続的なエラーが発生します。以下のスタック トレースの関連部分をコピーしました。

ここに私が知っている/見ているものがあります:-パッセンジャーを再起動すると問題が一時的に修正されるようです-コンソールから同じコードを実行すると期待どおりに動作します-/ 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'

かなり困惑。どんな助けでも大歓迎です。

4

2 に答える 2

0

との両方が読み取り/書き込み可能であり、それでもこのエラーが発生すると仮定すると、/dev/random?の/dev/urandomようなエントロピージェネレーターを実行/インストールする必要があるかもしれません。prngd

試す:

 $ sudo /etc/init.d/prngd start

prngdそれが失敗した場合は、最初にインストールします。

 $ sudo apt-get install prngd
于 2012-07-12T08:00:54.323 に答える
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

また、128 ビット未満のエントロピーが供給された場合、OpenSSL で報告されたエラーが発生することがわかっています。これは全部で 16 バイトです (または、OpenSSL が ASCII 印刷可能文字列を検出し、上位ビットを無視するほど賢い場合は 18..22)。

OpenSSL を初期化するシーケンスは、1342652367.A.0.B のようなものです。場合によっては、pid が十分に小さく、マイクロ秒が十分にゼロに近く、結果として得られるエントロピーが臨界しきい値を下回る可能性はありますか?

これは非常に簡単にテストできるはずです:

ary.join('.')

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

確かに128ビット、場合によっては256ビットの文字列の長さを合理的に予測できないようにするためです。

より明確なチェックは、例外を追加し、エラーがトリガーされたときの ary を出力することです。

于 2012-07-18T23:12:43.013 に答える