11 June 2014
RubyのHashの秘密
巷では個人情報保護の機運が高まっているからぼくもひとつそのための仕組みを考えてみたよ。ぼくのやり方はRubyのHashを使うんだ。
まずはHashにHashSecret
というモジュールを挿すよ。
Hash.include HashSecret
このHashは普通のHashのように使えるんだけど、そこに機密情報をセットするためのHash#secret=
というメソッドを追加するんだ。
h = {}
h[:name] = 'Charlie'
h[:job] = 'Programmer'
h # => {:name=>"Charlie", :job=>"Programmer"}
h.secret = 'My-password123' # 機密情報をセット!
で、ここからがミソなんだけれども、セットされた機密情報はHashを走査しても見えないんだ。
h.secret = 'My-password123' # 機密情報をセット!
h # => {:name=>"Charlie", :job=>"Programmer"}
h.each { |kv| p kv }
# >> [:name, "Charlie"]
# >> [:job, "Programmer"]
でも、secret
キーを使えばアクセスできる。
h[:secret] # => "My-password123"
複数の機密情報を扱いたい場合は、Hash#secret=
に配列やハッシュをセットすればいいんだ。
# 配列で機密情報を管理!
h.secret = []
h[:secret] << 'My-password123'
h[:secret] << 'charlie@secret.com'
h # => {:name=>"Charlie", :job=>"Programmer"}
h[:secret] # => ["My-password123", "charlie@secret.com"]
# ハッシュで機密情報を管理!
h.secret = {}
h[:secret][:credit] = '123-456-789-012'
h[:secret][:email] = 'charlie@secret.com'
h # => {:name=>"Charlie", :job=>"Programmer"}
h[:secret][:credit] # => "123-456-789-012"
h[:secret][:email] # => "charlie@secret.com"
h # => {:name=>"Charlie", :job=>"Programmer"}
ねっ?
でも、多分これだと、こう言う人がきっといるよね。
「HashSecret使ってんの分かったら、
secret
キーでアクセスされちゃうじゃん。バカなの?」
そんなときはsecret
キーに別の値をセットして隠蔽すればいいんだよ。
h[:secret] = 'Nothing here'
h[:secret] # => "Nothing here"
h # => {:name=>"Charlie", :job=>"Programmer", :secret=>"Nothing here"}
今度は、こういう声が聞こえてくるよ。
「それでどうやって機密情報にアクセスすんの?お前、あほなの?」
まあ、落ち着いて。
まずは、ヨガで言うところの「シッダアーサナ(達人座)」のポーズを取って目を閉じ静かに深く呼吸する。
で、心の中が「無」になったら、そこに浮かんだ「言葉」を読むんだ。
ぼくの言葉はこうだった。
:sekai_no_owari
さあ、試してみるよ!
h[:sekai_no_owari] # => {:credit=>"123-456-789-012", :email=>"charlie@secret.com"}
ほら、読めた!
…
つまらないネタ思いついちゃったので…。
まだ?(はてな)な人いるかもしれないから、HashSecret
の実装は下の方に置いておきますm(__)m
module HashSecret
def secret=(val)
self.default=(val)
end
end
Hash#default=
の別名かよ!
h[:foo] # => {:credit=>"123-456-789-012", :email=>"charlie@secret.com"}
h[:bar] # => {:credit=>"123-456-789-012", :email=>"charlie@secret.com"}
h[:blah_blah_blah] # => {:credit=>"123-456-789-012", :email=>"charlie@secret.com"}
h["秘密のコード教えて"] # => {:credit=>"123-456-789-012", :email=>"charlie@secret.com"}
機密情報のブロードキャストみたいな。
blog comments powered by Disqus