はじめに
データ変換と一口に言っても、その狙いはさまざまである。
似たような言葉が並ぶせいで混同されがちだが、次の3つの観点で整理すると違いが見えてくる。
- 元に戻せるか(可逆性)
- 戻すのに鍵が要るか
- 何のための変換か(目的)
本記事では、エンコード・シリアライズ・暗号化・ハッシュ化・圧縮・コンパイル・パースの7つを取り上げる。
エンコード
データをある規則に従って、別の形式・表現に変換することである。
Hello → SGVsbG8= (Base64)
あ → %E3%81%82 (URLエンコード)
代表例はBase64、URLエンコード(パーセントエンコーディング)、文字コード(UTF-8など)である。
鍵は不要で、規則さえ分かっていれば誰でも元に戻せる(デコードできる)。
主な目的は、別のルールや環境への適合と、通信・転送で安全に扱えるようにすることである。たとえばテキストしか通せない経路でバイナリを送るためにBase64を使う、といった用途が典型である。
秘匿のための仕組みではない点に注意したい。Base64は「暗号化」ではなく、誰でも復号できる。
シリアライズ
メモリ上のオブジェクトやデータ構造を、保存・転送できる形式(バイト列や文字列)に変換することである。逆方向の変換はデシリアライズと呼ぶ。
{ "id": 1, "name": "bmf" }
代表例はJSON、XML、YAML、Protocol Buffers、MessagePackである。
鍵は不要で、フォーマットを知っていれば誰でも元に戻せる。
主な目的は、オブジェクトの状態の保存・転送である。プロセス間通信、ネットワーク越しのデータ交換、ファイルへの永続化などで使われる。
対象が「構造化されたデータやオブジェクト」である点が特徴で、広い意味ではエンコードの一種ともいえる。
暗号化
鍵を使って、第三者が読めない形(暗号文)にデータを変換することである。逆方向の変換は復号と呼ぶ。
共通鍵暗号(AESなど)と公開鍵暗号(RSAなど)に大別される。
鍵があれば元に戻せるが、鍵がなければ現実的な時間では戻せない。この「鍵がなければ戻せない」点が、エンコードとの決定的な違いである。
主な目的は、盗聴の防止と機密性の確保、すなわちセキュリティである。
ハッシュ化
任意の長さのデータを、固定長の値(ハッシュ値)に変換することである。
password → 5e884898da... (SHA-256)
最大の特徴は一方向性で、ハッシュ値から元のデータには戻せない(不可逆)。同じ入力からは必ず同じ出力が得られ、入力がわずかに変わるだけで出力は大きく変わる。
代表例はSHA-256やSHA-3である。パスワード保存には、ソルトとストレッチングを備えたbcryptやArgon2を使うのが定石である。
主な目的は、パスワードの保護や改ざんの検知、データの同一性確認(チェックサム・指紋)である。
暗号化と混同されやすいが、「戻せない」点が決定的に異なる。なお、異なる入力が同じハッシュ値になる衝突は理論上存在するが、暗号学的ハッシュ関数では現実的に起こしにくいよう設計されている。
圧縮
データの冗長性を取り除いて、サイズを小さくすることである。
完全に元へ戻せる可逆圧縮(ZIP、gzip、PNGなど)と、完全には戻せない非可逆圧縮(JPEG、MP3、H.264など)がある。
可逆なら元通りに復元できるが、非可逆は人間が気づきにくい情報を捨てるため、厳密には元へ戻らない。
主な目的は、容量や転送量の削減、すなわち軽量化である。
コンパイル
ソースコードを、別の形式(機械語・バイトコード・別言語)に変換することである。
基本的に非可逆で、最適化や情報の欠落により元のソースコードを正確に復元するのは難しい。逆コンパイルは可能だが、変数名やコメントまで含めて元通りになるわけではない。
主な目的は、プログラムの実行である。人間が読み書きするコードを、計算機が実行できる形式へと変換する。
なおTypeScriptからJavaScriptへの変換のように、同水準の言語間での変換はトランスパイルと呼び分けることもある。
パース
文字列やバイト列を、文法に従って解析し、構造化されたデータ(構文木など)に変換することである。
代表例はJSONのパース、HTMLのパース、SQLパーサ、コンパイラの構文解析フェーズである。
他の方式と違い、主目的は「変換」そのものよりも、データの解析・抽出・意味づけにある。入力を読み解いて構造に起こすという意味では、シリアライズの逆方向に近い側面もある。
比較表
| 方式 | 元に戻せるか | 鍵の要否 | 主な目的 |
|---|---|---|---|
| エンコード | できる(誰でも) | 不要 | 別のルール・環境への適合、通信・転送 |
| シリアライズ | できる(誰でも) | 不要 | オブジェクトの状態の保存・転送 |
| 暗号化 | 鍵があればできる | 必要 | 盗聴防止・機密性の確保(セキュリティ) |
| ハッシュ化 | できない(不可逆) | 不要 | パスワード保護・改ざん検知 |
| 圧縮 | できる(可逆の場合) | 不要 | 容量・転送量の削減(軽量化) |
| コンパイル | 基本できない | 不要 | プログラムの実行 |
| パース | 目的が異なる(解析) | 不要 | データの解析・抽出 |
混同しやすいポイント
- エンコード ≠ 暗号化:Base64は誰でも戻せるため、秘匿性はない。隠したいなら暗号化を使う。
- ハッシュ化 ≠ 暗号化:ハッシュは戻せない。鍵で戻せる暗号化とは、目的と性質の両面で異なる。
- シリアライズ ⊂ エンコード:シリアライズは、構造化データやオブジェクトを対象にしたエンコードの一種と捉えられる。
- 圧縮 ≠ エンコード:圧縮はサイズ削減が目的で、可逆性の有無も方式による(広義にはエンコードの一種だが目的が異なる)。
まとめ
データ変換は種類が多く名前も似ているが、「元に戻せるか」「鍵が要るか」「何のための変換か」の3つの観点で並べると整理しやすい。
特にセキュリティの文脈では、エンコードを暗号化やハッシュ化の代わりに使ってしまう取り違えが起きやすい。秘匿したいなら暗号化、戻せないことが価値になるパスワード保護や改ざん検知ならハッシュ化、と目的から選ぶことが大切である。