第三回は暗号に関するお話をします。
ゲームサーバーを設計する上でも暗号の知識は不可欠です。
Game Server Services では適切な箇所で適切な暗号技術を採用するよう努力をしています。
どういった暗号技術があり、どういう場面で使用できるのかを正しく把握して、安全なサーバーシステムを開発しましょう。
前回
暗号技術の種類
暗号技術には大きく3種類の用途が存在します。
- 暗号化
- ハッシュ化
- 署名
暗号化
暗号化はデータをスクランブルし、データの内容を隠す目的で使用します。
正しい手段を用いれば、データの復元ができるのが暗号化です。なお、復元処理を復号と呼びます。復号化と呼ぶと復号化警察によって鉄槌がくだされます。
暗号化には複数の方式があります。
1. 共通鍵暗号
2. 公開鍵暗号
共通鍵暗号
共通鍵暗号は暗号化するときと復号するときで同じ暗号鍵を使用します。
古くはビット演算のXORから、RC4、最近であればAESといったアルゴリズムが使用されます。
同じ暗号鍵を使用するということは、復号できる人は暗号化も出来るということになります。
つまり、ゲームのデータの改竄行為を回避するために暗号化したい。というニーズに対して、共通鍵暗号を使用するのは愚策です。
なぜなら、改ざんしたデータを再び暗号化すれば、ゲームからは改ざんされたデータなのか判断がつかないからです。
共通鍵暗号方式を使う場合は、暗号化する側と復号する側がお互いに信頼できる関係である必要があります。
主にサーバー間通信や、ゲームであればマルチプレイのプレイヤー間通信の保護に使用する。といった用途が適切です。
公開鍵暗号
公開鍵暗号は暗号化する暗号鍵と、復号する暗号鍵が別のものを使う。というのが特徴です。
暗号化に使用する暗号鍵を秘密鍵、復号に使用する暗号鍵を公開鍵と呼びます。このような仕組みから公開鍵暗号と呼ばれます。非対称鍵暗号とも呼ばれます。
つまり、復号できても暗号化することはできませんので、正しく復号できるデータを送信してくる相手は信頼に値する。ということになります。
暗号鍵の鍵長
暗号鍵には鍵長が存在します。
AES256 RSA1024 RSA2048 といったキーワードを見たことがあるかもしれません。これは前半が暗号アルゴリズム、後半が鍵長を表しています。
AES256 であれば AESアルゴリズムで 256bit の鍵長の暗号鍵を使用して暗号化している。という意味になります。
どの鍵長を使用するべきか。という方針は年々変化します。
これは時の流れでコンピューティングの速度が早くなり、暗号解読にかかるコストが安くなっていくためです。
暗号強度と鍵交換
共通鍵暗号に対して公開鍵暗号の方が鍵長が長くなります。なぜなら、公開鍵暗号の仕様を実現するために共通鍵と同じ鍵長であれば、暗号強度が弱くなってしまうためです。
また、暗号化・復号処理に要する計算量も公開鍵の方が多くなります。
そのため、時間経過やアクセスしてきたプレイヤーごとに異なる共通鍵を使用して通信するようにし、接続した際に共通鍵の暗号鍵を秘密鍵で暗号化したデータをサーバーから配布し、プレイヤーは受け取とったデータを公開鍵で復号した後に、出てきた共通鍵を用いて以降の通信を行う。というような使い分けをします。
みなさんがよく使うWebサイトの https から始まるサイトに接続する際にも同様の処理が行われています。
ハッシュ化
ハッシュポテトを想像してもらえばわかるように、一定の法則に従ってデータをスクランブルして全く異なる値にしてしまいます。
ハッシュ化は暗号化とは異なり、データを元に戻すことはできません。
ハッシュドポテトを丸いじゃがいもに戻せないのと同じです。
この技術の使い所として、よくある例はパスワードの管理です。
よくパスワードが流出した。とニュースになりますが、正しくパスワードを取り扱っていれば、これは大した問題ではありません。
パスワードを保存するのに暗号化は不適切です。なぜなら元の形に戻せてしまうからです。
パスワードの保存には元に戻すことができないハッシュ化したデータを保存するようにするべきです。
パスワードを検証する場合には受け取ったパスワードを同じハッシュ関数を通して、保存した値と一致するかを検証すればいいわけです。
ここにも気をつけなければならない点があって、世の中には一般的な文字列や、流出したパスワードをハッシュ関数にかけた結果の一覧表が出回っているということです。これをレインボーテーブルと呼びますが、ただ一般的なハッシュ関数をかけただけでは、レインボーテーブルと突き合わせれば元のデータを特定される可能性があります。
このあたりは、何回もハッシュ関数にかける。ソルトをつける。など工夫がありますのでパスワードを取り扱う際にはよく調べた上で実装しましょう。
まちがえても平文(そのままのデータ)で保存しないように!
署名
暗号化やハッシュ化は元のデータを隠したり、不可逆な状態にすることが目的でした。
署名はデータ自体は読める状態を維持しつつ、改ざんされていないことを保証するための仕組みで、データ本体に追加して暗号鍵を使って検証できるデータ本体のハッシュ値をおくります。
署名は一般的に公開鍵暗号方式と組み合わせて使用します。
これは署名を検証するための暗号鍵と、署名を付与するための暗号鍵が同一になってしまうと署名の意味を成さないからです。
署名をつける側は秘密鍵を使ってデータに署名を付与し、署名を検証する側は公開鍵を使って署名を検証する。ということになります。
データ本体を改ざんするとハッシュ値が合わなくなるため、改ざんを検出できるうえに、改ざん後の値を元に署名を偽造しようと思っても秘密鍵を知らなければ作れない。というわけです。
ゲームサーバーではアセットを配布する際にアセットデータが改ざんされていないことを保証する署名を付けておき、クライアントは受け取ったアセットデータの署名を検証することで、悪意のあるアセットに差し替えられていないかを判定したりするのに使ったりします。
GS2のご紹介
Game Server Services では ゲームサーバーのレンタルをおこなっています。
個人からプロまで使えるゲームサーバー - Game Server Services(GS2)
それでは、また。
次回予告
ゲームサーバーはなぜ落ちるのか