無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

そろそろパスワードをちゃんとするか

パスワードをそろそろちゃんとしたい。一応ランダムでそれなりに長い文字列を使用しているのですが、憶えられないという理由で多くのサービスで同じパスワードを使っていたりする...申し訳ない。これだとどこかのサービスでパスワードが漏洩した場合に影響範囲が大なので、いい加減何とかしたいのです。
ということで、以前slashdot.jpで見たやり方を参考にしてパスワードを作るコードを書いてみました。

戦略

  • ユーザーにサービス名とパスフレーズを入力してもらう。
    • サービス名は"hatena.ne.jp"とか認証単位ごとに決まる文字列を使う。
    • パスフレーズはランダムでそれなりに長い文字列を採用し、これだけは暗記する。
  • スクリプト埋め込みの定数とサービス名、パスフレーズを連結した文字列を作る。
  • 文字列をSHA1でハッシュにする。
  • ハッシュをBase64エンコードしたものをパスワードに使う。

これで、パスフレーズさえ憶えておけばサービスごとに違うランダムなパスワードを生成できます。また、パスワードが漏洩しても次の条件が満たされない限り、虎の子のパスフレーズはばれない。

  • パスワードがばれる。
  • スクリプト埋め込みの定数がばれる。
  • スクリプト埋め込みの定数+サービス名+任意の文字列」とそのハッシュ値の辞書が作成され逆引きされる。

実装

require 'digest/sha1'
PREFIX  = "hoge" # 適当に変更すること。
puts [Digest::SHA1.digest( PREFIX + "." + ARGV[0] + "." + ARGV[1] )].pack("m")

使い方

サービス名「hogehoge.com」、パスフレーズ「xxx」の場合、以下のコマンドを実行。

ruby ./pass.rb hogehoge.com xxx

パスフレーズがシェルの履歴に残らないよう注意。以下は実行結果です。

yzkR0E0U2RyUr9qt+N/ehZDtuP0=