とりあえず知っておいた方が良いセキュリティ技術7選
以下7つについて簡単に解説。
- Hash
- Salt (Paper)
- HMAC
- Symmetric Encryption
- Keypairs
- Asymmetric Encryption
- Signing
1. Hashing
ハッシュとは、任意の長さのデータを固定長の長さの文字列に変換することです。この変換には以下のルールがあります、ちなみに変換後の文字列をハッシュ値と言います。
- 入力が同じ場合はハッシュ値も同じになる。
- 違う場合は必ず変換結果も異なる、つまりある入力に対してユニークなハッシュ値があてがわれます。
- ハッシュ値から入力を逆算できない。
ハッシュ化する方法は色々ありますがMD5やSHA-256が有名です。
目的
セキュリティ技術の根幹なので色々な用途がありますが、簡単な使用例としてはパスワードを保存することです。
サイト側でユーザーパスワードを保管する際に平文のパスワードを記録するとデータ漏洩時にリスクがありますが、代わりにハッシュ値を保管することで漏洩してもパスワードを解析させづらくします。
通信時も端末側でハッシュ化してから送信することでリスク低減を行うことができます。
2. Salt (and Papper)
ソルトとは、前述のパスワードをハッシュ化して保存する様な時に追加で行う処理です。
ソルトが使われる経緯ですが、単純にパスワードをハッシュ化するだけだとある状況で非常にまずいことになります。それはパスワードが非常によく使われる語句だった場合です。例えば文字列password
のハッシュ値は
5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8
ですが、このようなハッシュ値を大量に用意し攻撃対象のハッシュ値へ照会を行うことで効率的に平文を割り出します。
この問題への対策として、ハッシュ化する入力にランダムな文字列を追加することによってハッシュ値もランダムに変化させます。これがソルトです。
しかし、ソルトの弱点として追加された文字列がなんだったのかDBで記録する必要があるのでそれが流出する可能性があります。
ペッパーはソルトの弱点を克服する為のアイデアです。単純に追加する文字列をDBよりもセキュリティレベルが高い場所に保存することです。
3. HMAC
HMAC(Hash Based Message Authentication Code)とはデータ通信時に送信者の認証とデータ改竄を検知する仕組みです。
前提として共有鍵というデータを送受信者間で決めておきます。
その上で送信者はデータ+共有鍵のハッシュ値を再度ハッシュしたデータ(MAC値)をデータと共に送信します。そうすると
受信者側で受信したデータと共有鍵からMAC値を計算することで安全性を担保できます。何故なら両者のMAC値はデータと共有鍵の両方が一致した場合のみ等しくなる為、MAC値が異なっていた場合鍵が違うかメッセージが送信時と異なっていることになるからです。
message = "Hello World"
key = "secret"
mac = hmac.new(key, message)
message_sent = "Hello World!!"
if hmac.new(key, message_sent) != mac:
print("Altered message")
4. Symmetric Encryption
対象鍵暗号化はHMACの様なデータ通信時のデータを保護する仕組みです。対象、というように暗号化と復号化に同じ鍵を使用する方式です。
HMACだけでは通信中にデータを傍受されるとデータを読み取ることができてしまいます。そこで暗号化を行うことでデータを読み取ることを防ぎ、受信者側で復号化を行うことでデータを読み取ることができます。複合化に使用する鍵は送信者側と受信者側で共有しておく必要があります。
AES256等のアルゴリズムが有名です。
5. Key Pairs
非対称鍵暗号化は対象鍵暗号化とは異なり暗号化と復号化に異なる鍵を使用する方式です。送信者側で暗号化に使用する鍵を公開鍵と呼び、受信者側で復号化に使用する鍵を秘密鍵と呼びます。公開鍵と秘密鍵はペアであり、公開鍵で暗号化したデータは秘密鍵で復号化することができます。また、秘密鍵で暗号化したデータは公開鍵で復号化することができます。
公開鍵を別途用意することによって鍵の共有による漏洩リスクを回避することができます。
RSAが有名です。
6. Asymmetric Encryption
非対称鍵暗号化、特にSSLというプロトコルではウェブサイトがクライアントに送信するデータは公開鍵で暗号化し、クライアントは秘密鍵で復号化することで安全にデータを読み取ることができます。
7. Signing
署名とはデータの送信者を証明する仕組みです。暗号化ではデータを読み取れなくする仕組みですが、場合によっては内容よりも送信者が信頼できるかどうかが重要な場合があります。そのような場合に署名を使用します。署名は非対称鍵暗号化を使用しています。送信者はデータと秘密鍵から署名を生成し、データと共に送信します。受信者はデータと公開鍵から署名を検証し、署名が正しいかどうかを確認します。署名が正しい場合は送信者が正しいことが証明されます。