« フルスクリーンとフリックインとモーダルWindow | メイン | メニュー関するすれ違いが分かった »

2014年03月01日

吉里吉里Z 開発:: HMAC とユーザー認証

    

ハッシュ関数の MD5 と SHA256。
キー付きハッシュ関数の HMAC-SHA256。
この3つを加えることを検討している。
MD5 は元々あるので、TJS2 から呼べるようにするだけだが。

HMAC-SHA256 があるとユーザー認証を作りやすくなる。
HMAC は、秘密キーと任意メッセージを使いハッシュを生成する仕組み。

具体的な認証方法は以下の通り。

1. ユーザーへシリアルコードと秘密キーのペアを配布。
(明示的に分離せずにシリアルコード+秘密キーで、単一のシリアルコードとして配布した方が楽)

2. ローカルでの処理
秘密キーを使いメッセージからハッシュを生成する。
メッセージには、シリアルコード、日時(タイムスタンプ)、バージョン、コマンド、(タイトルID)などを含んだ文字列を入れる。
生成したハッシュを base64 encode して文字列化。
メッセージの末尾に加える。
生成したメッセージをサーバーへ送信する。
ハッシュのみではなく、生のメッセージとハッシュを送信する、秘密キーは送信されない。

3. サーバーでの処理
送られてきたメッセージからシリアルコードを抽出する。
シリアルから秘密キーを検索し、ハッシュ以外のメッセージ部分を使い、ローカルと同じようにハッシュ生成する。
生成したハッシュと送られてきたハッシュを比較し、一致すれば認証成功とする。
ただし、一番最後に認証成功したタイムスタンプ以前のタイムスタンプが送られてきている場合は、その時点で認証失敗とする。
これは同じハッシュで何度も認証成功させないため。
また、あまり現在時刻とかけ離れたタイムスタンプも使えなくする。
認証成功後は成功を返せばいいが、何かデータを返した方が都合がいいので、秘密キーを用いて暗号化し返信する。
失敗であればデータは返信せず、結果のみ返す。

4. ローカル
認証結果を見て成功であれば、返信されたデータを秘密キーを用いて復号化する。


以上が認証の基本的な仕組み。
シリアルと秘密キーのペアがばれなければ、突破は困難。
サーバーで送信元IPアドレスも記憶し、短期間に複数個所から認証を要求された場合、認証を一時的にロックするなどするとキーの漏えいにある程度対応可能。
秘密キーは HMAC-SHA256 でハッシュの生成に使われるのみで、送信はされない。
安全な方法でシリアルコードと秘密キーをユーザーに渡す必要がある。
後、説明では省いているがURLエンコード/デコードもGETを使うと必要になる。

ユーザーを認証してデータを返すだけの仕組みなので、どのようなデータを返してコピーガードに役立てるかは別に検討する必要がある。
XP3 のヘッダー情報はサーバーからもらうなどすると、XP3 が単なる巨大なバイナリの塊になるので解析が面倒になる。
暗号化していればなおさら大変で、そのキーはサーバーからもらうようにするなども考えられる。
さらにデータ量の少ないスクリプトはサーバーから圧縮して送られてくるようになっているとやっかい。
すぐに思いつくのはこの辺り。
サーバーから返すデータが少なければ、サーバーには GAE を使用して認証サーバーとするのが楽ではないかと思われる。

吉里吉里Z で自前ビルドしやすくなったので、クラック耐性を強化する機能もあった方が良いということで検討中。
返されたデータの復号化以外はプラグインでも良いが。



投稿者 Takenori : 2014年03月01日 23:02




comments powered by Disqus
Total : Today : Yesterday : なかのひと