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

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

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

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

Q&A

解決済

2回答

2606閲覧

Rubyのsecurerandomを使う意味

y-doi

総合スコア322

Ruby

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

0グッド

0クリップ

投稿2018/03/16 11:59

編集2018/03/16 12:13

こちらの記事で、以下のようにsecurerandomが使われています。(一部を簡略化してます)

ruby

1require 'securerandom' 2list = [*'a'..'z'] 3list[(SecureRandom.random_number(1.0) * list.size).floor]

こうではなくて、シンプルに

ruby

1list = [*'a'..'z'] 2list.sample

としてもいいように思えるのですが、あえてsecurerandomを使う意味は何でしょうか。

securerandomリファレンスによると

安全な乱数発生器のためのインターフェースを提供するモジュールです。

と書いてあります。
「安全な」の意味がよくわからないのですが、これと何か関係するのでしょうか。

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

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

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

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

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

guest

回答2

0

当該の記事は、Ruby: 「それっぽい」パスワードを生成するというものとなっています。

で、普通の乱数は簡単な数式で生成しているために、生成した乱数をかき集めると予測ができてしまいます。パスワードが予測されてはまずいですよね。

SecureRandomは、数学的に「乱数をかき集めても次に生成する乱数の予測ができない」という意味での安全性を持っています。パスワード、暗号鍵、セッションIDなど、予測されるとまずいものについてはSecureRandomで生成しましょう。

投稿2018/03/16 12:24

maisumakun

総合スコア145186

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

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

y-doi

2018/03/16 13:38

わかりやすい回答をありがとうございます。すぐに理解できました。
guest

0

ベストアンサー

simpleは内部で通常のRandomを使用しており、これはメルセンヌツイスターという安全ではない乱数です。では、ここでの安全というのはなにかというと、暗号などに安全に使えるかどうかと言うことです。SecureRandomのような安全な乱数生成機は暗号論的擬似乱数生成器と言われています。

まず乱数というのは統計学的に十分にランダムであることが求められ、これはそのような乱数は良い乱数と言われています。Randomが使用しているメルセンヌツイスターも良い乱数の一つですので、悪いわけではありません。しかし、そこからさらに、ある条件を見たなさなければ安全であるとは言えません。それは、排出された乱数から次の乱数を多項式時間の計算によって予測することができないことです。

通常の乱数はとてもランダムのように見えますが、ある程度の数の排出済み乱数があれば(その数は実装による)現在のシード値を予測できます。シード値が予測できれば、次の乱数の値も予測できます。これは、乱数生成機の逆演算のようなことができるようになっているからです。しかし、暗号論的擬似乱数生成機はその逆計算ができないようになっています。もちろん、乱数には周期がありますので全ての周期を回せばどのシード値だったのかを出す事はできますが、非常に多い周期の場合は現実的ではなく、実質、シード値がわからない、つまり、次に排出される乱数を予測することは不可能となります。

乱数が予測できると言うことは、乱数によって作られるリストも予測されてしまうと言うことです。

あくまで前回出ている乱数から次の乱数を予測すると言うだけなので、一回だけしか乱数を使わなければ関係無いと思うかも知れません。ですが、果たして本当に未来永劫に渡ってその一回だけなのでしょうか?連続してパスワード生成するとか変更があるかも知れません。例えば、Aさん用にパスワードを作成して、続けてBさん用にパスワードを作成し、それぞれ渡したとしましょう。この場合、Aさんが何らかのきっかけでBさんが次の人であると言うこと知った場合、自分のパスワードからBさんのパスワードを予測することが可能であれば、Bさんになりすましてログインすると言ったことが可能になります。しかし、暗号論的擬似乱数生成機を使用した場合、AさんがBさんのパスワードを予測するには現実的ではない時間が必要になり、その方法でBさんになりすますのはほぼ不可能になります。

他にも細かい条件があるのですが、上のリンク先のWikipediaも参考にしてみてください。とにかく、パスワードなど生成など予測されては絶対にいけないような物には、SecureRandomのような暗号論的擬似乱数生成機を使うことがお約束のような物になっています。もし、使用していなかった場合、そのアプリケーションに内在する脆弱性の一つとみなされます。

投稿2018/03/16 12:36

編集2018/03/16 12:37
raccy

総合スコア21735

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

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

y-doi

2018/03/16 13:38 編集

詳しい回答をありがとうございます。RandomとSecureRandomの違いについて納得できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問