経緯
業務で、DB内レコードの値を暗号化→別サイトに対するGETリクエストのURLパラメータとして設置
という処理を追加したのだが、「あれ、暗号化する必要あるよな。base64エンコードしたりURLエンコードも必要だろうけど、これってなんのためにするんだっけ。。。」みたいになったので、改めて調べてみた。
*ここではあくまでURLパラメータ実装に関する暗号化、エンコードに限定して記載する
暗号化
用途
一般的にどのユーザーがどのユーザーと関係があるのかや、ユーザー情報(名前、メールアドレス、住所など)などの個人情報をパラメータにすると、URLに読み取れる情報が含まれることになる。読み取り/悪用を避けるために、内容が容易にバレない形に書き換えてURLパラメータにすることが求められる。
ちょっと脱線
今回、暗号化方式はAES-256-CBC方式を採用したのだが、AES(1)-256(2)-CBC(3)のそれぞれの値が何を示すかも、ざっと調べてみた。
(1)Advanced Encryption Standardの略で、日本語に訳すと「先進的暗号化標準」。無線LANなどに用いられる暗号化アルゴリズムの一つ。アメリカ国立標準技術研究所により政府標準として認められている。共通鍵暗号。
(2)256ビットのキーを使用してプレーンテキストまたはデータを暗号に変換する、の意
(3)1つ前の暗号文ブロックと平文ブロックのXOR(排他的論理和)をとり、そのXORの値を暗号化を行うモード。ECBもよく見かけるが、ECBの場合同じ平文が複数存在したら、それらの平文は同じ値の暗号文ブロックに変換されてしまう欠点がある。CBCにはそのような欠点はない。
暗号化アルゴリズム(1)-ビット数(2)-モード(3)という三要素で表現されてるよう。
また、今回phpでの実装だったのですが、openssl_encryptメソッドで簡単に暗号化できて便利だなーと感じた。
base64エンコード
用途
base64はバイナリ形式からテキスト形式へデータを変換するエンコード形式。データ変換に際し64進数を利用し、64個の英数字を用いるためにこの名称。暗号化されたデータはバイナリ形式で得られる。バイナリ形式では人間が理解できる形式ではないので、人間にも理解しやすいように記述されたテキスト形式へbase64エンコードを用いて変換する。暗号化の一つと認識されている事例も散見されるが、あくまで形式変換の一種である。
URLエンコード
用途
URLの文字列データが空白文字や一部の記号(「$」、「#」など)、全角文字などを含んでいると正しく送信されない可能性があるため、それらの文字をエスケープする必要がある。それがURLエンコード。
#まとめ
・暗号化
→ 値を内容がわかりにくく安全性の高い形に変換
・base64エンコード
→ バイナリ形式をテキスト形式に変換
・URLエンコード
→ に含めることができない文字を
という感じだろうか。なんとなく「URL作るときゃエンコードやろ」くらいに使ってたのですが、内容を知るとなるほどなという感じ。まだまだ知らないことがたくさんあるなー。