ET & IoT Technology 2018 特集
連載
» 2018年09月18日 10時00分 公開

IoTセキュリティ基礎解説:組み込み技術者向けTLS1.3基礎解説(前編):まずはSSL/TLSについて知ろう (2/3)

[市原創(キヤノンITソリューションズ),MONOist]

3.SSL/TLSで使われる暗号技術

 TLSは複雑な仕組みのように思われがちだが、分解してみると基本的な暗号技術の組合せであることが分かる。使用されている主要な暗号技術を以下に挙げてみた。

  • 共通鍵暗号
  • 公開鍵暗号(鍵共有アルゴリズム)
  • ハッシュ関数
  • デジタル署名

 個別技術はそれぞれ目的や用途が異なるが、TLSはこれらを絶妙に組合せることで安全な通信を実現している。逆に言えば、1つでも欠ければその仕組みは脆弱性をさらしてしまうことになる。まずは、個別技術について大まかに理解しながら、どうやって暗号化通信を行うのかを見て行こう。

3.1 共通鍵暗号

 共通鍵暗号では、通信を行う二者が秘密の共通鍵(乱数データ)を所有する。送信側は共通鍵を使って情報を暗号化して送信し、受信側は同じ共通鍵を使って暗号文を復号して解読する。暗号化/復号は、通信文と鍵のデータ列の演算処理によって実現する。詳細な解説は省くが、シフト演算や排他的論理和演算、並列処理などコンピュータの得意な処理に最適化しており大量データの暗号化/復号処理に向いている。そのため通信データの大部分は共通鍵暗号で暗号化される。一般的なアルゴリズムとしてはDES(3DES)やAES、RC4などがある。

3.2 公開鍵暗号

 公開鍵暗号は、秘密鍵と公開鍵の2種類の「鍵ペア」を使用する。公開鍵暗号の画期的な点は、暗号化と復号の鍵が異なることだ。共通鍵暗号では、遠距離や不特定の相手とどうやって鍵を共有するかという問題(鍵配送問題)があった。公開鍵暗号なら、公開鍵に限って堂々と通信路を使って渡すことができる。公開鍵で暗号化した暗号文は、ペアとなる秘密鍵によってのみ復号できるが、秘密鍵を知っているのは暗号文の受信者だけなので第三者は暗号文を復号できない。

 公開鍵暗号は数学的問題の計算の困難さに基づいており、鍵なしで問題を解くには天文学的な計算が必要となることが安全性の根拠となっている。アルゴリズムとしてはRSA(素因数分解問題)、ElGamal(離散対数問題)、ECC(楕円曲線上の離散対数問題)などが一般的だが、共通鍵暗号に比べると演算処理が遅いことが欠点だ。

図1 図1 共通鍵暗号と公開鍵暗号(クリックで拡大)

 大量のデータ通信には共通鍵暗号が適しているが、鍵配送問題がある。そこで秘密を守りながら共通鍵を共有するために、公開鍵暗号の性質を利用した鍵共有アルゴリズムが考案された。

 共通鍵を作るための情報をRSAで暗号化して受け渡す手法、公開鍵の交換と演算で情報を共有するDH(Diffie-Hellman)、それを楕円曲線暗号を使って行うECDH(Elliptic Curve DH)という手法が一般的だ。DHやECDHでは通信を行う二者が異なる鍵ペア(公開鍵と秘密鍵)をそれぞれ所有している状態で、互いの公開鍵を交換し、それぞれの秘密鍵と組み合わせて計算すれば両者で共有する同じ値を求めることができる。少し分かりにくいかもしれないが、公開鍵暗号の面白い性質でもあるので興味のある人は詳しく調べてみてほしい。

3.3 ハッシュ関数

 ここまでは通信の秘密を守る技術だが、そもそも通信相手は正しいのか(認証)、受け取った情報は改ざんされていないか(改ざん検知)を検査するために使われるのがハッシュ関数だ。

 実装としてはSHA(Secure Hash Algorithm)がよく知られている。ハッシュ関数は、可変長のデータや文字列を入力すると一意に決まる固定長のデータ列(ハッシュ値)を出力するが、入力値が一文字でも違うと全く異なるハッシュ値になる特徴がある。データの指紋のようなものだと考えると分かりやすい。

 通信文を改ざんすればハッシュ値も変わるのでハッシュ正解値と計算したハッシュ値の一致を確かめることで改ざんの有無が分かる。TLSでは、ハッシュを偽造できないように共通鍵とハッシュを組み合わせたHMAC(Hash-based Message Authentication Code)を通信データに付加することで完全性検証と認証を行っている※)

※)認証付き暗号を使っている場合HMACは不要

3.4 デジタル署名

 HMACによる検証は、信用できる相手と同じ共通鍵を所有していることが前提だ。しかし、共通鍵を生成するための鍵共有手法は、通信する二者の間に割って入って互いの相手になりすます「MITM(Man-In-The-Middle)攻撃」を防げない。そのためTLSでは「デジタル署名」を使って鍵を共有する相手の正当性を検証する仕組みを持っている。

 デジタル署名は、公開鍵暗号とハッシュを組み合わせた手法だ。具体的な仕組みは図2を参照してほしい。公開鍵暗号では、実は秘密鍵で暗号化し、公開鍵で復号することもできる。誰でも復号できる暗号に意味があるのか、と思われるかもしれないが、署名は誰もが正しい公開鍵を使って復号し検証できることに意味がある。仮に通信文が改ざんされればハッシュが一致しなくなり、署名を差し替えた場合は公開鍵で署名を復号できなくなる。

 通信相手を認証するためには公開鍵に自身のドメインや所属などを表す情報と署名を付加した「公開鍵証明書」という形式にして通信相手に送信するのが一般的だ。公開鍵証明書は通常、認証局という信頼できる第三者機関が正しさを保証し署名を付加している。公開鍵証明書を受け取った相手は、認証局の公開鍵で署名を検証すればその証明書と公開鍵の正当性が分かる。もちろん認証局の公開鍵も公開鍵証明書になっており、上位機関の公開鍵によって検証可能だ。この仕組みはインターネットのインフラとして浸透しておりPKI(Public Key Infrastructure)と呼ばれる。

図2 図2 デジタル署名とPKI(クリックで拡大)

 以上を簡単にまとめると、TLS通信の基本的な仕組みが見えてくる。

  1. 公開鍵暗号技術とPKIにより通信相手の正当性を検証する
  2. 鍵共有により共通鍵やその素材となる情報を通信相手と共有する
  3. 共有した共通鍵で通信データを暗号化・復号する
  4. 暗号化データにHMACなどの認証情報を付加しデータの完全性を検証する

Copyright © ITmedia, Inc. All Rights Reserved.