OpenSSLを用いたデジタル署名

デジタル署名には2つの方法がある
– メッセージに署名するケース
– メッセージのハッシュ値に署名するケース

1. テスト用ファイルの作成
$ echo foobar > foo.txt

2. dsaパラメータの作成(Digital signature algorithm)
DSAパラメータを1セット作成し、PEMファイルに出力する。1024ビット長の素数を利用
$ openssl dsaparam 1024 -in /dev/random -out dsa_param.pem

3. プライベート鍵の作成
$ openssl gendsa dsa_param.pem -out dsa_private.pem

4. 公開鍵の作成
DSAプライベート鍵からDSA公開鍵を作成
$ openssl dsa -in dsa_private.pem -pubout -out dsa_public.pem

5. ダイジェストの作成
テキスト用ファイル(foo.txt)からダイジェストを作成する
$ openssl dgst -sha1 foo.txt | awk ‘{print $2}’ > foo.txt.sha1.sum

6. ダイジェストの署名
DSA秘密鍵を用いて、ダイジェストファイル(foo.txt.sha1sum)からデジタル署名を作成する
$ openssl dgst -dss1 -sign dsa_private.pem -out foo.txt.sig foo.txt.sha1sum

7.ダイジェストの検証
$ openssl dgst -dss1 -sign dsa_private.pem -out foo.txt.sig foo.txt.sha1sum

OpenSSLで秘密鍵、公開鍵の作成

RSAを用いて公開鍵暗号方式で暗号化、複合化を行う

1. 秘密鍵の作成
$ openssl genrsa -out private.pem 2048

※暗号化した秘密鍵の作成
$ openssl genrsa -out private_secure.pem -aes256 2048

2. 公開鍵の作成
$ openssl rsa -in private.pem -pubout -out public.pem

3. ファイルの準備
$ echo ‘hoge’ > file.txt

4. 公開鍵で暗号化
$ openssl rsautl -encrypt -inkey public.pem -pubin -in file.txt -out file.encrypted
$ hexdump file.encrypted

5. 秘密鍵で復号化
$ openssl rsautl -decrypt -inkey private.pem -in file.encrypted -out file.decrypted
$ cat file.decrypted
hoge

OpenSSLで共通鍵作成

1. 暗号化するデータの用意
$ echo hoge > file.txt

2. 共通鍵の作成
$ openssl rand -base64 32 > rand.txt
※-out rand.txtだとExtra arguments given.でエラーになる

3. データの暗号化
$ openssl enc -e -aes128 -kfile rand.txt -in file.txt -out file.aes128_64 -base64
$ cat file.aes128_64
U2FsdGVkX19QJLESvS5Z/08k+CWpOjXqe9GA08NuCzE=

4. データの複合化
$ openssl enc -d -aes128 -kfile rand.txt -in file.aes128_64 -base64
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
hoge

### 初期ベクトルを指定する方法
-iv: 初期ベクトル
-K: 秘密鍵
$ mkdir src
$ echo hello > src/file.txt
$ openssl enc -aes-128-cbc -in src/file.txt -out src/file.txt.enc -K 1234567890abcdef0123456789abcdef -iv 00000000000000000000000000000000
$ openssl enc -d -aes-128-cbc -in src/file.txt.enc -out src/file.txt.decrypted -K 1234567890abcdef0123456789abcdef -iv 00000000000000000000000000000000
※AES-128の秘密鍵と初期ベクトルは32桁の128bit

HTTPとHTTPSの違い

## HTTPとは
・HTTP(Hyptertext Transfer Protocol)はWebサーバとWebブラウザの間でWeb情報をやり取りするためのプロトコル(通信規則)
・多くの場合、HTTPはTCPと組み合わせて使い、UDPと組み合わせるケースは稀。サーバがHTTP通信を受け取るポート番号は通常80番。HTTPプロキシ(高パフォーマンスのコンテンツフィルタなど)で特殊な用途で利用する場合は、80番ポート以外を利用する

## HTTPとHTTPSの違い
HTTPとHTTPSの違いは通信が暗号化されていないか暗号化されているかの違いで、HTTPSは暗号化されている。HTTPS(Hypertext Transfer Protocol Secure)は、HTTPで安全に通信を行うための仕組み。HTTPSのポート番号は443番が割り当てられている。
HTTPSは特別なプロトコルが定められているわけではなく、SSL(Secure Sockets Layer)/TLS(Transport Layer Security)と呼ばれる安全な接続を使って、その上でHTTPによる通信を行う。そのため、HTTPの持つシンプルで汎用性の高い特性はそのまま活かされている。
HTTPSは盗聴することができず、改ざんを検知することもできる。

## SSLサーバ証明書とHTTP暗号化通信
HTTPSによる暗号化通信はSSLサーバ証明書をサーバにインストールして実現できる
認証レベルにもDV認証、OV認証、EV認証と別れている

## httpsのページが表示されるまでの流れ
httpsではじまるURLにウェブブラウザがアクセスしようとすると、クライアント(ブラウザ)とサーバ間で以下のようなネゴシエーションが行われる
1. ブラウザはサーバにhttpsリクエストを送信
2. ブラウザとサーバで利用する暗号方式を決定
3. サーバからブラウザにSSLサーバ証明書と公開鍵を送付
4. ブラウザはプリマスターシークレットを送信し、ブラウザとサーバで共通鍵を生成
5. ブラウザとサーバは共通鍵を使用して、データを暗号化して送受信する

## 暗号アルゴリズムの決定メカニズム
大抵の場合、クライアントとサーバは複数の暗号アルゴリズムを使用できる。そのため、通信を開始する前に、使用するアルゴリズムを決定しなければならない
1. クライアントはサーバにSSL通信をリクエストする際に、サーバに利用可能な暗号アルゴリズムを送付する
2. サーバは使用するアルゴリズムを選択し決定する
3. サーバはSSLサーバ証明書と利用する暗号アルゴリズムをクライアントに送信
4. クライアントはサーバから受信した情報に基づいてデータを暗号化

## アルゴリズムの選択
2048ビット長の鍵が主流
SSL通信で使用されるアルゴリズムは公開されている。暗号データは暗号化と復号で使用される鍵で守られている。アルゴリズムが解っているため、鍵が重要。鍵長を長くすることで暗号は解読されにくくなる。

$ openssl ciphers -v ‘HIGH’
TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD
TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD
TLS_AES_128_GCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESGCM(128) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
DHE-DSS-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=DSS Enc=AESGCM(256) Mac=AEAD
DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH Au=ECDSA Enc=CHACHA20/POLY1305(256) Mac=AEAD
ECDHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH Au=RSA Enc=CHACHA20/POLY1305(256) Mac=AEAD
DHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=DH Au=RSA Enc=CHACHA20/POLY1305(256) Mac=AEAD
ECDHE-ECDSA-AES256-CCM8 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESCCM8(256) Mac=AEAD
ECDHE-ECDSA-AES256-CCM TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESCCM(256) Mac=AEAD
DHE-RSA-AES256-CCM8 TLSv1.2 Kx=DH Au=RSA Enc=AESCCM8(256) Mac=AEAD
DHE-RSA-AES256-CCM TLSv1.2 Kx=DH Au=RSA Enc=AESCCM(256) Mac=AEAD
ECDHE-ECDSA-ARIA256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=ARIAGCM(256) Mac=AEAD
ECDHE-ARIA256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=ARIAGCM(256) Mac=AEAD
DHE-DSS-ARIA256-GCM-SHA384 TLSv1.2 Kx=DH Au=DSS Enc=ARIAGCM(256) Mac=AEAD
DHE-RSA-ARIA256-GCM-SHA384 TLSv1.2 Kx=DH Au=RSA Enc=ARIAGCM(256) Mac=AEAD
ADH-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=None Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(128) Mac=AEAD
ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD
DHE-DSS-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=DSS Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(128) Mac=AEAD
ECDHE-ECDSA-AES128-CCM8 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESCCM8(128) Mac=AEAD
ECDHE-ECDSA-AES128-CCM TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESCCM(128) Mac=AEAD
DHE-RSA-AES128-CCM8 TLSv1.2 Kx=DH Au=RSA Enc=AESCCM8(128) Mac=AEAD
DHE-RSA-AES128-CCM TLSv1.2 Kx=DH Au=RSA Enc=AESCCM(128) Mac=AEAD
ECDHE-ECDSA-ARIA128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=ARIAGCM(128) Mac=AEAD
ECDHE-ARIA128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=ARIAGCM(128) Mac=AEAD
DHE-DSS-ARIA128-GCM-SHA256 TLSv1.2 Kx=DH Au=DSS Enc=ARIAGCM(128) Mac=AEAD
DHE-RSA-ARIA128-GCM-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=ARIAGCM(128) Mac=AEAD
ADH-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=None Enc=AESGCM(128) Mac=AEAD
ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA384
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA384
DHE-RSA-AES256-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(256) Mac=SHA256
DHE-DSS-AES256-SHA256 TLSv1.2 Kx=DH Au=DSS Enc=AES(256) Mac=SHA256
ECDHE-ECDSA-CAMELLIA256-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=Camellia(256) Mac=SHA384
ECDHE-RSA-CAMELLIA256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=Camellia(256) Mac=SHA384
DHE-RSA-CAMELLIA256-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=Camellia(256) Mac=SHA256
DHE-DSS-CAMELLIA256-SHA256 TLSv1.2 Kx=DH Au=DSS Enc=Camellia(256) Mac=SHA256
ADH-AES256-SHA256 TLSv1.2 Kx=DH Au=None Enc=AES(256) Mac=SHA256
ADH-CAMELLIA256-SHA256 TLSv1.2 Kx=DH Au=None Enc=Camellia(256) Mac=SHA256
ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA256
ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA256
DHE-RSA-AES128-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(128) Mac=SHA256
DHE-DSS-AES128-SHA256 TLSv1.2 Kx=DH Au=DSS Enc=AES(128) Mac=SHA256
ECDHE-ECDSA-CAMELLIA128-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=Camellia(128) Mac=SHA256
ECDHE-RSA-CAMELLIA128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=Camellia(128) Mac=SHA256
DHE-RSA-CAMELLIA128-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=Camellia(128) Mac=SHA256
DHE-DSS-CAMELLIA128-SHA256 TLSv1.2 Kx=DH Au=DSS Enc=Camellia(128) Mac=SHA256
ADH-AES128-SHA256 TLSv1.2 Kx=DH Au=None Enc=AES(128) Mac=SHA256
ADH-CAMELLIA128-SHA256 TLSv1.2 Kx=DH Au=None Enc=Camellia(128) Mac=SHA256
ECDHE-ECDSA-AES256-SHA TLSv1 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA1
ECDHE-RSA-AES256-SHA TLSv1 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA1
DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1
DHE-DSS-AES256-SHA SSLv3 Kx=DH Au=DSS Enc=AES(256) Mac=SHA1
DHE-RSA-CAMELLIA256-SHA SSLv3 Kx=DH Au=RSA Enc=Camellia(256) Mac=SHA1
DHE-DSS-CAMELLIA256-SHA SSLv3 Kx=DH Au=DSS Enc=Camellia(256) Mac=SHA1
AECDH-AES256-SHA TLSv1 Kx=ECDH Au=None Enc=AES(256) Mac=SHA1
ADH-AES256-SHA SSLv3 Kx=DH Au=None Enc=AES(256) Mac=SHA1
ADH-CAMELLIA256-SHA SSLv3 Kx=DH Au=None Enc=Camellia(256) Mac=SHA1
ECDHE-ECDSA-AES128-SHA TLSv1 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA1
ECDHE-RSA-AES128-SHA TLSv1 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA1
DHE-RSA-AES128-SHA SSLv3 Kx=DH Au=RSA Enc=AES(128) Mac=SHA1
DHE-DSS-AES128-SHA SSLv3 Kx=DH Au=DSS Enc=AES(128) Mac=SHA1
DHE-RSA-CAMELLIA128-SHA SSLv3 Kx=DH Au=RSA Enc=Camellia(128) Mac=SHA1
DHE-DSS-CAMELLIA128-SHA SSLv3 Kx=DH Au=DSS Enc=Camellia(128) Mac=SHA1
AECDH-AES128-SHA TLSv1 Kx=ECDH Au=None Enc=AES(128) Mac=SHA1
ADH-AES128-SHA SSLv3 Kx=DH Au=None Enc=AES(128) Mac=SHA1
ADH-CAMELLIA128-SHA SSLv3 Kx=DH Au=None Enc=Camellia(128) Mac=SHA1
RSA-PSK-AES256-GCM-SHA384 TLSv1.2 Kx=RSAPSK Au=RSA Enc=AESGCM(256) Mac=AEAD
DHE-PSK-AES256-GCM-SHA384 TLSv1.2 Kx=DHEPSK Au=PSK Enc=AESGCM(256) Mac=AEAD
RSA-PSK-CHACHA20-POLY1305 TLSv1.2 Kx=RSAPSK Au=RSA Enc=CHACHA20/POLY1305(256) Mac=AEAD
DHE-PSK-CHACHA20-POLY1305 TLSv1.2 Kx=DHEPSK Au=PSK Enc=CHACHA20/POLY1305(256) Mac=AEAD
ECDHE-PSK-CHACHA20-POLY1305 TLSv1.2 Kx=ECDHEPSK Au=PSK Enc=CHACHA20/POLY1305(256) Mac=AEAD
DHE-PSK-AES256-CCM8 TLSv1.2 Kx=DHEPSK Au=PSK Enc=AESCCM8(256) Mac=AEAD
DHE-PSK-AES256-CCM TLSv1.2 Kx=DHEPSK Au=PSK Enc=AESCCM(256) Mac=AEAD
RSA-PSK-ARIA256-GCM-SHA384 TLSv1.2 Kx=RSAPSK Au=RSA Enc=ARIAGCM(256) Mac=AEAD
DHE-PSK-ARIA256-GCM-SHA384 TLSv1.2 Kx=DHEPSK Au=PSK Enc=ARIAGCM(256) Mac=AEAD
AES256-GCM-SHA384 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(256) Mac=AEAD
AES256-CCM8 TLSv1.2 Kx=RSA Au=RSA Enc=AESCCM8(256) Mac=AEAD
AES256-CCM TLSv1.2 Kx=RSA Au=RSA Enc=AESCCM(256) Mac=AEAD
ARIA256-GCM-SHA384 TLSv1.2 Kx=RSA Au=RSA Enc=ARIAGCM(256) Mac=AEAD
PSK-AES256-GCM-SHA384 TLSv1.2 Kx=PSK Au=PSK Enc=AESGCM(256) Mac=AEAD
PSK-CHACHA20-POLY1305 TLSv1.2 Kx=PSK Au=PSK Enc=CHACHA20/POLY1305(256) Mac=AEAD
PSK-AES256-CCM8 TLSv1.2 Kx=PSK Au=PSK Enc=AESCCM8(256) Mac=AEAD
PSK-AES256-CCM TLSv1.2 Kx=PSK Au=PSK Enc=AESCCM(256) Mac=AEAD
PSK-ARIA256-GCM-SHA384 TLSv1.2 Kx=PSK Au=PSK Enc=ARIAGCM(256) Mac=AEAD
RSA-PSK-AES128-GCM-SHA256 TLSv1.2 Kx=RSAPSK Au=RSA Enc=AESGCM(128) Mac=AEAD
DHE-PSK-AES128-GCM-SHA256 TLSv1.2 Kx=DHEPSK Au=PSK Enc=AESGCM(128) Mac=AEAD
DHE-PSK-AES128-CCM8 TLSv1.2 Kx=DHEPSK Au=PSK Enc=AESCCM8(128) Mac=AEAD
DHE-PSK-AES128-CCM TLSv1.2 Kx=DHEPSK Au=PSK Enc=AESCCM(128) Mac=AEAD
RSA-PSK-ARIA128-GCM-SHA256 TLSv1.2 Kx=RSAPSK Au=RSA Enc=ARIAGCM(128) Mac=AEAD
DHE-PSK-ARIA128-GCM-SHA256 TLSv1.2 Kx=DHEPSK Au=PSK Enc=ARIAGCM(128) Mac=AEAD
AES128-GCM-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(128) Mac=AEAD
AES128-CCM8 TLSv1.2 Kx=RSA Au=RSA Enc=AESCCM8(128) Mac=AEAD
AES128-CCM TLSv1.2 Kx=RSA Au=RSA Enc=AESCCM(128) Mac=AEAD
ARIA128-GCM-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=ARIAGCM(128) Mac=AEAD
PSK-AES128-GCM-SHA256 TLSv1.2 Kx=PSK Au=PSK Enc=AESGCM(128) Mac=AEAD
PSK-AES128-CCM8 TLSv1.2 Kx=PSK Au=PSK Enc=AESCCM8(128) Mac=AEAD
PSK-AES128-CCM TLSv1.2 Kx=PSK Au=PSK Enc=AESCCM(128) Mac=AEAD
PSK-ARIA128-GCM-SHA256 TLSv1.2 Kx=PSK Au=PSK Enc=ARIAGCM(128) Mac=AEAD
AES256-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA256
CAMELLIA256-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=Camellia(256) Mac=SHA256
AES128-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA256
CAMELLIA128-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=Camellia(128) Mac=SHA256
ECDHE-PSK-AES256-CBC-SHA384 TLSv1 Kx=ECDHEPSK Au=PSK Enc=AES(256) Mac=SHA384
ECDHE-PSK-AES256-CBC-SHA TLSv1 Kx=ECDHEPSK Au=PSK Enc=AES(256) Mac=SHA1
SRP-DSS-AES-256-CBC-SHA SSLv3 Kx=SRP Au=DSS Enc=AES(256) Mac=SHA1
SRP-RSA-AES-256-CBC-SHA SSLv3 Kx=SRP Au=RSA Enc=AES(256) Mac=SHA1
SRP-AES-256-CBC-SHA SSLv3 Kx=SRP Au=SRP Enc=AES(256) Mac=SHA1
RSA-PSK-AES256-CBC-SHA384 TLSv1 Kx=RSAPSK Au=RSA Enc=AES(256) Mac=SHA384
DHE-PSK-AES256-CBC-SHA384 TLSv1 Kx=DHEPSK Au=PSK Enc=AES(256) Mac=SHA384
RSA-PSK-AES256-CBC-SHA SSLv3 Kx=RSAPSK Au=RSA Enc=AES(256) Mac=SHA1
DHE-PSK-AES256-CBC-SHA SSLv3 Kx=DHEPSK Au=PSK Enc=AES(256) Mac=SHA1
ECDHE-PSK-CAMELLIA256-SHA384 TLSv1 Kx=ECDHEPSK Au=PSK Enc=Camellia(256) Mac=SHA384
RSA-PSK-CAMELLIA256-SHA384 TLSv1 Kx=RSAPSK Au=RSA Enc=Camellia(256) Mac=SHA384
DHE-PSK-CAMELLIA256-SHA384 TLSv1 Kx=DHEPSK Au=PSK Enc=Camellia(256) Mac=SHA384
AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1
CAMELLIA256-SHA SSLv3 Kx=RSA Au=RSA Enc=Camellia(256) Mac=SHA1
PSK-AES256-CBC-SHA384 TLSv1 Kx=PSK Au=PSK Enc=AES(256) Mac=SHA384
PSK-AES256-CBC-SHA SSLv3 Kx=PSK Au=PSK Enc=AES(256) Mac=SHA1
PSK-CAMELLIA256-SHA384 TLSv1 Kx=PSK Au=PSK Enc=Camellia(256) Mac=SHA384
ECDHE-PSK-AES128-CBC-SHA256 TLSv1 Kx=ECDHEPSK Au=PSK Enc=AES(128) Mac=SHA256
ECDHE-PSK-AES128-CBC-SHA TLSv1 Kx=ECDHEPSK Au=PSK Enc=AES(128) Mac=SHA1
SRP-DSS-AES-128-CBC-SHA SSLv3 Kx=SRP Au=DSS Enc=AES(128) Mac=SHA1
SRP-RSA-AES-128-CBC-SHA SSLv3 Kx=SRP Au=RSA Enc=AES(128) Mac=SHA1
SRP-AES-128-CBC-SHA SSLv3 Kx=SRP Au=SRP Enc=AES(128) Mac=SHA1
RSA-PSK-AES128-CBC-SHA256 TLSv1 Kx=RSAPSK Au=RSA Enc=AES(128) Mac=SHA256
DHE-PSK-AES128-CBC-SHA256 TLSv1 Kx=DHEPSK Au=PSK Enc=AES(128) Mac=SHA256
RSA-PSK-AES128-CBC-SHA SSLv3 Kx=RSAPSK Au=RSA Enc=AES(128) Mac=SHA1
DHE-PSK-AES128-CBC-SHA SSLv3 Kx=DHEPSK Au=PSK Enc=AES(128) Mac=SHA1
ECDHE-PSK-CAMELLIA128-SHA256 TLSv1 Kx=ECDHEPSK Au=PSK Enc=Camellia(128) Mac=SHA256
RSA-PSK-CAMELLIA128-SHA256 TLSv1 Kx=RSAPSK Au=RSA Enc=Camellia(128) Mac=SHA256
DHE-PSK-CAMELLIA128-SHA256 TLSv1 Kx=DHEPSK Au=PSK Enc=Camellia(128) Mac=SHA256
AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1
CAMELLIA128-SHA SSLv3 Kx=RSA Au=RSA Enc=Camellia(128) Mac=SHA1
PSK-AES128-CBC-SHA256 TLSv1 Kx=PSK Au=PSK Enc=AES(128) Mac=SHA256
PSK-AES128-CBC-SHA SSLv3 Kx=PSK Au=PSK Enc=AES(128) Mac=SHA1
PSK-CAMELLIA128-SHA256 TLSv1 Kx=PSK Au=PSK Enc=Camellia(128) Mac=SHA256

Cookie規制とは

## Cookieとは
Cookieとはサイトに訪れたユーザ情報を一時的にユーザのブラウザに保存する仕組み
サイト分析、広告配信などのトラッキング技術に利用されるほか、ID、パスワード、メールアドレス、訪問回数などユーザ情報として保存するためにも活用される

## 企業視点でのCookie利用例
– 自社サイトを訪問した人にCookieを付与し、その対象者に向けてリターゲティング広告を配信
– ユーザが最終的にコンバージョンに至るまでの過程でどのような行動履歴を取ったのかアトリビューション計測をする

### 1st party cookieと3rd party cookie
1st Party Cookie: サイトの運営者が発行しているCookie
3rd party cookie: 第三者が発行しているCookie
=> 複数のサイトを横断して閲覧した履歴を追跡していくために使われており、その情報を様々なデータと紐付けて活用されている。
=> プライバシーの観点で問題視されている
=> 日本でも改正個人情報保護法が施行され、Cookieなどの個人情報を第三者に提供し個人情報紐付けを行う場合は本人の同意が必要になった

### Apple社の対応
Safari内で3rd party cookieを利用したユーザの行動データの収集を規制、完全にブロックされている
=> リターゲティング広告が利用できない
=> コンバージョン・アトリビューション計測精度の低下(最初の訪問から数日経ってからのコンバージョンはCookie情報がなくなってしまう)

### Google社
3rd party cookieを利用したユーザの行動データの収集を2024年後半に段階的に廃止する

ストレージの暗号化

ストレージ暗号化とは、ストレージ内部のデータを暗号化することで、正しい鍵を持っているユーザ以外はデータを利用できないようにする仕組みのこと
ストレージを暗号化しておくことで、不正アクセスの被害にあった際や、ストレージを盗聴されたり紛失したりした際の情報漏洩を防ぐことができる 
ただし、鍵の情報が漏洩すると暗号化しても情報が漏洩してしまう。また、マルウェア感染などの脅威は防げない

1. 暗号化ソフトを利用する
ESET Endpoint Encryption: 有名なESETの暗号化ソフト
NonCopy2: 純国産ソフトウェア
セキュリティ・ウェアハウス: windowsと似た操作感で使いやすさが魅力の暗号化ソフト

2. 標準搭載機能を使う
Windows10Proなどに標準機能として入っているBitLockerが有名

3. 暗号化機能のあるストレージを使う
クラウドストレージでも暗号化機能を備えたサービスは多い

また、ストレージの暗号化だけでなく、マルウェア対策、多要素認証、バックアップなどの対策も大切

メールの暗号化

## メールの暗号化とは?
メールの本文や添付ファイルを暗号化して第三者によってメールにアクセスされないようにすること
暗号化ソフトを導入すれば、通常通りメールの送受信をするだけで自動的に暗号化されて第三者による盗聴や改ざんを防ぐ
メールの暗号化には公開鍵暗号方式と秘密鍵暗号方式の2つがある

## 公開鍵暗号方式
公開鍵暗号方式は「公開鍵」「秘密鍵」と呼ばれる2つの鍵を利用してデータのやり取りを行う方法
1. 秘密鍵を使って公開鍵を作成
2. メール相手に公開鍵を送付
3. 公開鍵を受け取った側が公開鍵を使ってメールを暗号化
4. 暗号化されたメールを受信し、公開鍵を作るときに使った秘密鍵で複合する

## 秘密鍵暗号方式
秘密鍵暗号方式は共通鍵のみでデータを暗号化・複合する

## メール暗号化方法の種類
メールの暗号化には次の2つのプロトコル(通信手順)が用いられる
– PGP・S/MIME: メールの暗号化、電子署名に使われている
– SSL・TLS: インターネット上でやり取りされる通信を暗号化する技術。SSL/TLSを使うには第三者機関が発行するサーバ証明という電子証明書が必要

### Gmailでの確認方法
Gmailでは暗号化されていないメールサーバを経由して送られてきたメールをやり取りした時に、暗号化されていないことを示すマークが表示される

### Outlookでの確認方法
Outlookでも設定を確認することができる

Basic認証の脆弱性

Basic認証では.htaccess, .htpasswdという2つのヘッダが働いている。
サーバの認証をかけたいフォルダに.htaccess, .htpasswdというファイルを作成するだけ

## Basic認証のデメリット
– サーバを跨いだ認証設定ができない
– クローラが巡回できないため、SEO対策ができない
– セキュリティレベルが高いとは言えない

## Basic認証の脆弱性
– 脆弱性が指摘される理由として、「文字コードの種類」「httpであること」が挙げられる
– Basic認証ではログイン情報を入力する際に「Base64」を平文でやり取りする 「http」通信のため、盗聴されやすい
– 公開直前の確認用Webページ、特定のメンバーとのみ共有する場合、無料サイトなどは簡易的な認証で問題ない。個人情報は含めてはいけない
– Basic認証はクローラが巡回しない

Basic認証はブラウザにID、パスワードを保存する。Base64でエンコードされているが、デコードすれば簡単に確認できる
また、ログアウト機能がない

APIの暗号化

ほとんどのAPIはREST(Representational State Transfer)またはSOAP(Simple Object Access Protocol)で実装されている
REST APIはTLS暗号化(HTTPS)をサポートする。そのため、データを読み取ることも変更することもできない
REST APIはJSONも使用する。SOAP APIよりも高速

SOAPはXML暗号化、XML署名、SAMLトークンを組み合わせて使用する

### APIセキュリティ強化の例
– トークンを使用する
– 暗号化と署名を使用する
– 脆弱性を特定する
– クオータとスロットリングを使用する
– APIゲートウェイを使用する

### API管理とセキュリティ
– APIキー
– 基本認証
– OpenID Connect

MySQLで暗号化、復号化

* AES_ENCRYPT()/ AES_DECRYPT()などの暗号化関数を使用する

CREATE TABLE IF NOT EXISTS `user` (
	`user_id` VARCHAR(100) NOT NULL,
	`password` VARBINARY(200) NOT NULL,
	PRIMARY KEY (`user_id`)
)
COMMENT='ユーザ'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=11;

INSERT INTO `user`(`user_id`,`password`) VALUES(`user1`,AES_ENCRYPT(`password1`,`ENCRYPT-KEY`));
INSERT INTO `user`(`user_id`,`password`) VALUES(`user2`,AES_ENCRYPT(`password2`,`ENCRYPT-KEY`));
INSERT INTO `user`(`user_id`,`password`) VALUES(`user2`,AES_ENCRYPT(`password3`,`ENCRYPT-KEY`));

SELECT `user_id`, AES_DECRPYPT(`password`, `ENCRYPT-KEY`) FROM `user`;