けんぼうは留年生

ノンジャンルで何か書きたくなった時に書く感じ

お家で簡単!Quine(クワイン)の作り方

Quine(クワイン)という物をご存知でしょうか?
あるコードを実行すると自身のコードを出力するという不思議なプログラムのことです。
今日は皆さんとこれを作っていきたいと思います。
(料理番組のテーマっぽい音楽を脳内BGMで流しといてください。)

続きを読む

brain f*ckの実行結果を返すTwitterのbotを作りました

タイトルの通りBrainf*ckのコードを送りつけるとその実行結果の標準出力を返してくれるbotを作りました。使い方とか色々まとめておきます。

続きを読む

Minecraftでサーバーやってるから我が家を紹介します

たまにはゲームの話でもしましょう。
MinecraftのMOD鯖建ててるんで今日は自宅とMODの紹介をしたいと思います。
入ってるMODはこんな感じです。
・Thermal Expansion
Redstone Arsenal
・Rail Craft
・黄昏の森
・Open Computers
・EnderIO
現在住人随時募集中なので興味あったらTwitter(@kembo_net)かコメント欄等で連絡くださいな。

続きを読む

Rubyでメソッドの引数の変数名をそのまま同名のインスタンス変数に代入したい

インスタンスを生成する時に引数が多くなることはぼちぼちあると思う。
んで、その引数を受け取るローカル変数の名前と代入したいインスタンス変数の名前が同じなこともよくあることだと思う。
でも、それをこんな風に書くのは何とも面倒。

class Hoge
  def hogehoge(var1, var2, var3, ……)
    @var1 = var1
    @var2 = var2h
    @var3 = var3
    ……
  end
end

こんなの書きたくないけど書かなければ代入できない。

てなわけでやりたいことを自動化してRuby自身にやってもらうことにした。

class Hoge
  def hogehoge(var1, var2, var3, ……)
    self.method(__method__).parameters.each do |arg_type, arg_name|
      instance_eval "@#{arg_name} = #{arg_name}"
    end
  end
end

これで解決した……のかな?

[追記]
RubyistたちのDRY症候群との戦い
これに書いてあるのも似たようなことをしている……のかな?

続・僕の考えた最強のパスワード

昨日こんな記事を書いたけど
僕の考えた最強のパスワード - けんぼーは留年生
今ひとつとっ散らかっているのでもう一度整理したい。
まずは当たり前の話から。

パスワードは何のためにあるか

これは個人を見分けるためだ。Aさんにだけ見せたい情報があったらAさんしか知らない合言葉を聞き出せば良い。それがパスワードだ。

パスワードは私しか知らない

個人を見分ける物なのだから他人も知っていたら意味が無い。例えばキーボードの配置とか恋人の名前とか車のナンバープレートとか、他人も知り得る情報をパスワードのヒントにするのは辞めるべきだ。あまり考えたくはないが、貴方の周囲に悪意を持つ人が現れないとも限らないし、パスワードを調べるために貴方の身辺調査をする人もいるかもしれない。最悪の場合を想定しよう。

パスワードは流出する

パスワードを照合するにはサービス提供側もパスワードを知る必要がある。尤も直接知っていたら先の「パスワードは私しか知らない」に反するので、良い感じに暗号化(ハッシュ化)して元のパスワードが分からないように保管している。これで万一パスワードが漏れても大丈夫……のはずだったが、実際にはパスワードのパターン数は有限なわけで片っ端から総当りをかけていけばいつかパスワードはバレてしまう。それにサービス提供者の中にはアホな人もいてパスワードを平文で保存しているかもしれない。パスワードが流出するような事態はそう頻繁に起こるわけではないが、それでも沢山のサービスを使用していればそのリスクは上がる。全てが流出する可能性は低いかもしれないが、1つ2つくらいなら流出してもおかしくないという心構えが必要だ。

だからパスワードは使い回し出来ない

パスワードは流出するのだからもし、同じパスワードや容易に類推出来るようなパスワードはNGだ。

単純な物もダメ

総当りで計算する場合、攻撃者はもちろん単純で組み合わせの少ないパスワードから試す。従ってパスワードは単純であればある程危険だ。なるべく大文字小文字数字記号を混ぜて複雑で意味不明で長い文字列にするべきだ。英単語やローマ字なんて論外だし、それを多少別の文字で置き換えたくらいでは安全とは言えない。

定期的に変えたい

パスワードが流出した際、即座にそれが感知出来るとは限らない。見つからないようにこっそり情報だけ取り出して監視している場合も考えられる。これを回避するには定期的なパスワードの更新が必要だ。

パスワードは覚えられない

さて、先述の三点を組み合わせると私たちはサービス毎に複雑なパスワードを覚えなければならない上に、それを定期的に変更する必要がある。そんなのは無茶な話だ。

解決策1:パスワード管理ソフト

ランダムパスワードを生成し、それを保管してくれるものだ。マスターパスワードを1つ覚えればそれだけで無数のランダムパスワードを管理することが出来る。例え1つが流出しても他のパスワードは無関係なので問題無い。変更も容易だ。定期的な変更を促すためにタイマー付の物もあるらしい。もちろんどのソフトにするかはしっかり考え選ばないといけない。物によってはパスワードの暗号が弱く解読されてしまうような物もあるかもしれないし、入力したパスワードを横流しする悪意のあるソフトもあるだろう。暗号方式の確認と出来ればオープンソースの物が良いだろう。自作するのが一番確実だ。ただし、保管しているデータ自体が破損すれば二度とパスワードは戻らない。

解決策2:僕の考えた最強のパスワード

ハッシュを介して単純なキーワードからパスワードを計算する。要するにパスワードの作り方とその種」を覚えておく方法だ。ハッシュ関数を使えばパスワードが漏れてもそこから元のパスワードの種を特定することは困難だ。種に日付や年を表す文字を追加すれば定期的に変更することも容易だ。見た目はランダムパスワードと変わらない。自分が種となるキーワードとパスワードの計算手順を忘れさえしなければ、例えパソコンが吹っ飛んでもパスワードは守られる。ただ、パスワードが逆算されるリスクは排除出来ないしそう考えると前述の管理ソフトの方がセキュリティ性は高い気がする。

わざわざソフト作る・探す・使うの面倒くさいんだけど

別にパスワード流出しても構わないと言うのであればどうぞ。と言いたいところだけど場合によっては他人の情報も巻き添え食って流出するリスクあるので手間かけてください。パスワード管理ソフトなら自動入力してくれる物あります。むしろ自分で入力するより楽なはずです。


結論:パスワードは大切にね

僕の考えた最強のパスワード

パスワードに欲しい要件を考えた。

  1. 無意味な文字列であること。
  2. 十分長い。
  3. サービスによって違うものを使い分ける。
  4. 特に重要な物については定期的に変更する

これらをすべて満たしたパスワードをサービスの数だけ作り覚えていく……無理だろ。
勿論世の中にはパスワードを保存して管理してくれるソフトなんかもあるようだが、

  • いつでも自分の環境というわけではない。
  • 保存したパスワードが流出、あるいは破損するリスク。

ということを考えるとイマイチ安心して使えない。
パスワードを保存せず、そして沢山覚えなくて良い方法は無いものか。
最初に思いついたのは「同じパスワード+サービス名」という方法だが、
普通に考えてパスワードが流出したら他の物も類推出来てしまうので意味が無い。

そして僕は思いついた。
ハッシュ値をパスワードにすれば良いじゃん。

ハッシュ値とはハッシュ関数によって得られる値だ。
例えばあるハッシュ関数にAという値を入れてBというハッシュ値が得られたとする。
AからBを計算することは容易だが、BからAを逆算することは非常に困難。
これがハッシュの性質だ。
「同じキーワード+サービス名」からハッシュ値を取ってそれをパスワードにすれば

  • 無意味な文字列
  • 長い
  • サービスによって違う

の全てを満たすことが出来る。
ついでに2014とか付加すれば毎年違うパスワードだって可能だ。
そして、もしパソコンのデータが全て吹っ飛ぶみたいな不幸な事故が起こっても
この方法ならキーワードとパスワードの計算方法を覚えている限りいつでもパスワードを復元できる。
ちょっと特異な環境でもちゃちゃっとパスワードを計算するスクリプトを書けば
いつでもどこでもパスワード生成器が作れる。
例えばjavascriptとかで実装すればブラウザでアクセスするだけで実行可能だ。*1

もちろんハッシュ値と言えど完全に逆算が出来ないわけではなくて、
例えば総当りすれば答えは出るし時間をかければ特定することは可能だ。
だが、パッと見はランダムな文字列と変わらないし、
わざわざ一手間かける人はいないと期待したい。
仮にいたとしても同じハッシュ値が得られる候補は複数存在する。
入力するキーワードが長ければ長いほど攻撃者は面倒を強いられる。

というわけで実際にHSPでサクッと作ってみた。*2
http://www.kembo.org/password_generator.zip

ハッシュ関数にはMD5を使ってみた。理由は特に無い。
安全性がどうのと言われるが、それは大体衝突性の問題なので
逆算が困難なのは多分どのハッシュ関数でも同じはず……だよね?

返ってくるハッシュ値は16進数だったので
それを2^n種類ではない記号列に集約するのにすごろくみたいな方式にした。
例えばa1,a2,a3,……という値をn種類の記号列に変換する時は
(a1)%n, (a1+a2)%n, (a1+a2+a3)%n, ……
と言った具合に。
これでまぁ大体の文字の偏りも軽減されてると思う。多分。



で、ここまでやっといて気が付いたんだけど
普通パスワードって平文じゃなくハッシュで保存してるんだよなぁ。
ハッシュがただ二重になっただけだなぁ。
普通に暗号化したパスワードをクラウドに保管してるのでも
大して変わらないんじゃないだろうか……。

もう寝よう。


追記

この方法同じキーワードを何度も入力するから
ショルダーハッキングのリスクは大きいなと思った。

追記2

↑じゃあキーワード入力BOXを複数用意して、
片方の入力値は一度入力したら終了するまで保管するようにすればええやん。
パスワードの作り方の問題とは関係無かった。

*1:尤もその場合はページが改竄されているリスクに注意を払うべきだ。

*2:僕としてはこれをそのまま使うのではなく、各自がこれを参考に適当に実装して使うことを想定している。