質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

OpenSSL

OpenSSLはSSL/TLSのプロトコルと一般的な暗号のライブラリを導入するオープンソースのソフトウェアのツールキットです。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

Q&A

解決済

1回答

3814閲覧

Rubyで、ランダムなバイト列を生成する方法で、セキュリティ的に最善なのはどの方法ですか?

f_acid

総合スコア56

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

OpenSSL

OpenSSLはSSL/TLSのプロトコルと一般的な暗号のライブラリを導入するオープンソースのソフトウェアのツールキットです。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

0グッド

2クリップ

投稿2015/07/24 14:13

編集2015/07/24 15:19

16バイトのランダムなバイト列を生成します。私はこれについて3種類の方法を知っていますが、どれが最善でしょうか?

Ruby

1require 'openssl' 2require 'securerandom' 3 4def rbyts 5 #/dev/randomから読み込む 6 File.read('/dev/random', 16) 7 or 8 #SecureRandomを使う 9 SecureRandom.random_bytes(16) 10 or 11 #OpenSSL::Randomを使う 12 OpenSSL::Random.random_bytes(16) 13end

P.S.
また、以下の状況に於いてそれぞれどれが最善かも知りたいです。

  • 乱数の種に使う

(OpenSSL::Random.seed rbyts)

  • ランダムな鍵を公開鍵で暗号化して使う
  • saltに使う

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stripe

2015/07/24 16:45

ちなみに、乱数に対するセキュリティの良し悪しって、どのように判断しますか?
f_acid

2015/07/25 01:39

できるだけばらけて、時間やその他から予測しにくいことです。
guest

回答1

0

ベストアンサー

本当にランダムで確実なのは"/dev/random"ですが、きわめて遅いです。
シードに使うために最初だけとかならいいですが、何回も呼び出すと
エントロピーが貯まるまでの待ちが発生し、プログラムがその間停止します。
環境依存になりますが、その場合は"/dev/urandom"を使った方がいいでしょう。
"/dev/urandom"は真のランダムではない疑似乱数ではありますが、
暗号論的疑似乱数生成器のようです(OSのマニュアルを読むべきかも知れませんが)。

次のSecureRandomですが、下記のような実装になっています。(Ruby 2.2.2で確認)

  1. OpenSSLが使用できるならOpenSSL::Randomを使う。
  2. 1.が使えず、かつ、Windowsなら、CryptGenRandomを使う。
  3. 1.も2.も使えないなら、/dev/urandomを使う。
  4. 上全部がつかえないなら、NotImplementedErrorで例外発生。

OpenSSL::Randomについても単に呼び出すだけでなく、
現在のナノセコンドレベルのクロック時間をエントロピーに追加するなどの
初期化も勝手にしてくれます。
OpenSSLが確実にあるとは限らない環境(たとえばWindows)も想定するのであれば、
この方法が一番いいかと思います。

最後のOpenSSL::RandomSecureRandomと違って
エントロピーを自分で細かく追加できます。
逆に言うと使用前にエントロピーを自分で追加しない場合は
OS上のOpenSSLのバージョン依存となり、十分なエントロピーを使わない場合もあるようです。
安全性を考慮するなら、OpenSSL::Random.random_add()などで
エントロピーを追加をしておくべきでしょう。

以上ですが、仕様書などでエントロピーの長さや実装に言及がなければ、
SecureRandomが使いやすく、安全性も十分だと思います。
ここぞという所でのみ/dev/randomを使う(ただし、何度も呼び出しは駄目)のが
いいのではないでしょうか?

投稿2015/07/24 23:18

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問