LoginSignup
5
7

More than 3 years have passed since last update.

そろそろ暗号方式やらデジタル署名やらを理解する

Last updated at Posted at 2020-07-21

ソフトウェアエンジニア歴そろそろ1年だしまとめる。

暗号方式2種類

(1)秘密鍵(共通鍵)暗号方式

  • HS256 (HMAC with SHA-256)はそのアルゴリズムの一つ(?)
    • クライアント側とサーバー側が共通のSecretKeyを持つ。
  • JWT, HTTPS通信の実際のやり取りで使われる

  • 公開鍵暗号方式より高速(1/1000)で暗号化、復号の処理ができると言われている。

(2)公開鍵暗号方式

暗号化を用いた技術

デジタル署名(2を使用)

  1. 送信者Aは秘密鍵と公開鍵を作成し、公開鍵を受信者Bさんに渡す。
  2. 送信者側は「伝えたいメッセージ」と「その署名(メッセージをハッシュ化して、秘密鍵で暗号化した暗号文)」を両方送信する。
  3. 受信者側は「メッセージ」をハッシュ化したもの署名を暗号鍵で復号したものが同一であるかを確認することによって署名が信頼できるものかを確認する。

image.png
画像

JWT(1or2を使用)

JWT = ヘッダー + ペイロード + 署名

image.png
画像

  • 署名の作り方は以下の2通り。

    • RS256(公開鍵+秘密鍵を使うやつ)
    • HS256(Secret Keyを使うやつ)
  • JWS (JSON Web Signature)は、ザックリ言うと「JSONに電子署名をして、URL-safeな文字列として表現したもの」です。参考までに、JWE (JSON Web Encryption)は「JSONを暗号化して、URL-safeな文字列として表現したもの」です。

HTTPS通信(1→2を使用)

(1)クライアント側で作った共通鍵をサーバに送るまで(ディフィー・ヘルマン鍵共有)

  • サーバとクライアントの両方が(ある程度ルールを示し合わせた上で)各々公開鍵と秘密鍵を発行し、公開鍵のみを相手に送信し、各自、自分の秘密鍵と受信した公開鍵から(同一の!)共通鍵を作成できる方法である。
  • 第三者が送受信されるデータ(すなわち、二人の公開鍵)を盗聴しても鍵を生成することができない所に特徴がある。

[補足]
なお昔はこの様に通信していたが、TLS v1.3 では RSA 公開鍵による共通鍵生成方式は廃止になりました。
1. サーバでRSAキーペアを作り、公開鍵をクライアントに送信する(ちなみに、デジタル証明書も一緒に送信される)
2. クライアントは共有鍵を作成し、それを公開鍵で暗号化してサーバに送信する
3. サーバでは秘密鍵を用いて、受信した公開鍵を復号する

(2)サーバとクライアント間の共通鍵の交換後

SSLサーバー証明書を発行する手順

  1. サーバはSSLサーバ証明書をサーバーにインストールする必要がある。
  2. サーバー運用者が認証局CAに申請し、身分確認後、(認証局の秘密鍵で暗号化された)SSL証明書をサーバーに渡す。
  3. ウェブサイトの運営者が正しい運営者かの審査ののちに発行される
    • DNSでFQDNから発行されたIPアドレスをもとにサーバーにアクセスしてきたクライアントに対して、確かにそのIPアドレスは君がアクセスしようとしているFQDNですということを証明する。
    • この中で秘密鍵暗号方式が使用されている。またいつか調べる。

image.png
画像

SSH通信

(1)パスワード認証方式

(2)公開鍵認証方式(2を使用)

  • 公開鍵認証方式で、クライアントがキーペアを発行し、サーバー側に公開鍵を保存しておく。
    • デジタル署名と同形式

image.png
画像

5
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7