YAPC::Asia Tokyo 2011でベストトーク賞3位をいただきました

YAPC::Asia Tokyo 2011で「Webアプリでパスワード保護はどこまでやればいいか」というタイトルでトークして、投票によりベストトーク賞3位というのをいただいたそうです。
「そうです」というのは、実は発表・表彰の際に会場にいなかったという大失態を演じたからでして、少しでも受賞の可能性を考えていたら万難を排して残っていたのですが、錚々たる方々がトークされるYAPCでベストトーク賞がいただけるなど思いもよらず、所用もあったため、その場にいなかったのです。
「その場にいなかったから賞は次点の方に」なんてことにならないかハラハラしました(というのは冗談で、選んで頂けただけで光栄です)が、JPAの牧さんから、賞品の送付先住所をメールして欲しいと連絡頂きましたので、これは本当だったのだと確信して、このエントリーを書いています。私がその場にいなかったために、余計な手間を取らせてしまい、申し訳ありません。
また、副賞としてiPadを頂戴できるということで、ちょうど電子書籍を読むために安いAndroidタブレットでも買おうと思っていたところでしたので、とても良いタイミングで世界一のタブレットをいただけることになりとても嬉しいです。

今年は、PHPカンファレンス2011でもトークさせて頂きましたが、このような開発系のコミュニティでトークして、それが受け入れて頂けるというのが私にとっては一番嬉しいことです。Webアプリケーションのセキュリティの専門家にとって、セキュリティの方法論を開発者の皆様に実践してもらわないことには何も始まらないからです。そんなわけで、PHPカンファレンスYAPCトークに応募しているわけですが、トーク採択されただけでも嬉しいのに、聴衆の開発者たちに好意的に受け入れられ、このような賞までいただけるとは最高の喜びです。

トークのスライドは別途公開しようと思いますが、取り急ぎ、スライドに出てくる唯一のPerlスクリプトを紹介します。これは、「体系的に学ぶ 安全なWebアプリケーションの作り方」に出てくるソルトとストレッチングのサンプル(P327)をYAPCにあわせてPerlに移植したものです。

#!/usr/bin/perl
use strict;
use warnings;
use Digest::SHA qw(sha256_hex);

# FIXEDSALTはサイト毎に変更してください
my $FIXEDSALT = 'bc578d1503b4602a590d8f8ce4a8e634a55bec0d';
my $STRETCHCOUNT = 1000;

# ソルトを生成する 
sub get_salt {
  my ($id) = @_;
  return $id . pack('H*', $FIXEDSALT); # ユーザIDと固定文字列を連結
}

# ソルト化ハッシュを繰り返し求める(ストレッチング) 
sub get_password_hash {
  my ($id, $pwd) = @_;
  my $salt = get_salt($id);
  my $hash = '';  # ハッシュの初期値
  for (my $i = 0; $i < $STRETCHCOUNT; $i++) {
    $hash = sha256_hex($hash . $pwd . $salt); # ストレッチング
  }
  return $hash;
}
# 呼び出し例
print get_password_hash('user1', 'pass1') . "\n";
print get_password_hash('user1', 'pass2') . "\n";
print get_password_hash('user2', 'pass1') . "\n";

ご覧のように、古典的なPerlスクリプトでモダンでもなんでもないですが、use strict;とuse warnings;だけは忘れないように、何度も確認しました:)

最後になりましたが、YAPC::Asiaを開催されたJPAのスタッフ、ボランティア、他のトーカー、お集まり頂いた皆様の全てにお礼を申し上げます。来年もネタがあれば(ネタを作って)トークしたいですね。今後ともよろしくお願い致します。

[PR]
体系的に学ぶ 安全なWebアプリケーションの作り方」のDRMフリーPDFによる電子版が販売開始しました。今なら、キャンペーン価格\1,800-(36%OFF)でお求め頂けます(10月17日まで)。購入はこちらから。キャンペーン終了が迫っていますので、購入検討中の方はお早めに。