25
第3回Web技術勉強会 暗号技術編その1 田実

第3回web技術勉強会 暗号技術編その1

Embed Size (px)

Citation preview

Page 1: 第3回web技術勉強会 暗号技術編その1

第3回Web技術勉強会暗号技術編その1

田実 誠

Page 2: 第3回web技術勉強会 暗号技術編その1

暗号技術の話の前に…

超絶オススメな書籍暗号技術入門 秘密の国のアリス(結城浩[著])https://www.amazon.co.jp/dp/4797382228

• 「入門」とあるが一般的なエンジニアが一般的な案件の暗号化要件に必要な知識を習得するには十分すぎる内容。

• 暗号技術は様々な考え方、技術が組み合わさっているため理解しづらい分野だが、「入門」とある通り、かなりわかりやすくまとまっている。

• 「読んでよかった!」と自信を持って勧められる本の一つ

Page 3: 第3回web技術勉強会 暗号技術編その1

• なぜ暗号化をするのか• 各セキュリティ特性のための暗号化技術• 暗号化技術がわかると何がわかるか• 暗号とセキュリティ

• 対称暗号方式• DES• 3DES• ブロック暗号のモード

• ECBモード• CBCモード

• パディング• 鍵の配送問題

• まとめ

アジェンダ

Page 4: 第3回web技術勉強会 暗号技術編その1

なぜ暗号化するのか

• 通信の機密性• 第三者が盗聴しても通信の内容を知ることができない

• 通信の正真性• 改竄防止

• 通信の認証• メッセージが期待した相手から来たものであるかを確かめる(「誰」からのメッセージか)

• 通信の否認不可能性• 「メッセージを送った」という事実を拒否することが出来ない

暗号化をすることで以下のセキュリティ特性を高めることが出来る

Page 5: 第3回web技術勉強会 暗号技術編その1

各セキュリティ特性のための暗号化技術• 通信の機密性

• 対称暗号…DES, 3DES, AES

• 公開鍵暗号…RSA, 楕円曲線暗号

• 通信の正真性

• 一方向ハッシュ関数…MD5, SHA1, SHA2

• メッセージ認証コード…Hmac-SHA1, Hmac-SHA2

• デジタル署名…RSA, DSA

• 認証

• メッセージ認証コード

• デジタル署名

• 否認不可能性

• デジタル署名

Page 6: 第3回web技術勉強会 暗号技術編その1

暗号化技術がわかると何がわかるか• SSL/TLS(サーバー証明書、クライアント証明書)

• Digest認証

• SSHの公開鍵認証

• SAML

• WS-Security(SOAPヘッダ拡張)

• OpenID Connect(JWT)

• Json Web Key(JWK)のパラメータ

• Linuxの/etc/shadow(パスワードのハッシュを格納)

• 各サービスのREST APIの認証プロトコル(特にAWS)

• DNSSec

• ダウンロードリンクについているハッシュの意味

• VPN(PPTP/L2TP/IPSec…)

• SMTPのDKIM

• ブロックチェーン

• 暗号ライブラリのパラメータ(暗号アルゴリズム?キー?IV?モード?パディング?ソルト?証明書?)

Page 7: 第3回web技術勉強会 暗号技術編その1

暗号とセキュリティ• 秘密の暗号アルゴリズムは使わない

• 暗号アルゴリズムの秘密は必ず暴かれる→暴露されることによって強さを減じる危険性

• 強い暗号アルゴリズムを生み出すことは非常に困難

• 世界に公開されている強い暗号アルゴリズムは長い年月をかけて暗号解読者が解読を試みてみたものばかり

• どんな暗号もいつかは解読される

• 暗号はセキュリティのほんの一部であり、暗号化だけでセキュリティが解決するわけではない

• 最も弱いリンクは暗号ではなく人間

Page 8: 第3回web技術勉強会 暗号技術編その1

対称暗号方式• 暗号化、復号化ともに同じ鍵を使用する。

• アルゴリズムとしてはDES, 3DES, AESなど※DESは強度が弱いので使わないこと

• 公開鍵暗号と比べると計算コストが低い

• N*(N-1)/2程度の鍵が必要(通信相手の組み合わせ分の鍵が必要)

• 同一の鍵を利用することによる、鍵の配送問題がある→受信者に鍵を送るときに盗まれてしまうと暗号化も復号化も出来てしまう

Page 9: 第3回web技術勉強会 暗号技術編その1

ブロック暗号 - DESの場合 -• 64bitの平文を64bitの暗号文に暗号化する

• 平文のまとまりをブロックと呼ぶ

• 一般にブロック単位で処理を行う暗号アルゴリズムをブロック暗号を呼ぶ

• 64bitより長い平文を暗号化する場合は、ブロック暗号を繰り返す。この繰り返しの方法をモードと呼ぶ。

• ファイステルネットワークを採用してラウンドと呼ばれる暗号化のステップを何回も繰り返す(詳しいアルゴリズムに関しては書籍を参照)

Page 10: 第3回web技術勉強会 暗号技術編その1

DESの概念図

平文64bit

鍵56bit

暗号文64bit

DESによる暗号化

平文64bit

鍵56bit

暗号文64bit

DESによる復号化

Page 11: 第3回web技術勉強会 暗号技術編その1

64bit以上の場合(ECBモード)

平文1 平文2 平文3 平文4

暗号化対象

暗号文1 暗号文2 暗号文3 暗号文4

暗号化 暗号化 暗号化 暗号化

Page 12: 第3回web技術勉強会 暗号技術編その1

3DES1.DESによる暗号化2.DESによる復号化3.DESによる暗号化とDESを三回行う暗号化方式。全てを同じ鍵にするとDESと等価になるので、DESと互換性がある。

DES-EDE2(暗号化[1,3]と復号化[2]で鍵を分ける)DES-EDE3(全てのプロセスで異なる鍵を使う)

AES• ブロック長は128bit、鍵長は128, 192, 256bit• SPN構造• DESより高速

Page 13: 第3回web技術勉強会 暗号技術編その1

ブロック暗号のモード• ブロック暗号にはモードという概念がある

• ECB(Electric CodeBook)

• CBC(Cipher Block Chaining)

• CFB(Cipher FeedBack)

• OFB(Output-FeedBack)

• CTR(CounTeR)

• 前から順にブロック暗号を適用するのはECBモードと呼び、最も機密性が低い• 平文ブロックと暗号文ブロックが一対一の関係になり、繰り返しの要素がある場合、暗号解読

のヒントを与えてしまう。

• ブロックを入れ替えるだけで簡単に改竄が出来てしまう

• どのモードも一長一短あるので特性に応じて選ぶべきだが、基本的にはCBCモードでOK

Page 14: 第3回web技術勉強会 暗号技術編その1

ECBモードがダメな理由(繰り返しの推測)平文1 平文2 平文3 平文4

}≪¢&°z7 °z7UA }≪¢&°z7 °z7e?¬?o

暗号化 暗号化 暗号化 暗号化

暗号文1と暗号文2は同じ値→平文も同じはず→元の平文に繰り返しの要素がある、というヒントを与えることになる。

Page 15: 第3回web技術勉強会 暗号技術編その1

ECBモードがダメな理由(改竄が簡単)

暗号文1 暗号文2 暗号文3

とある送金用のプロトコルで1ブロック目(DESだと1~64bit) => 送金元の銀行口座番号2ブロック目(DESだと65~128bit) => 送金先の銀行口座番号3ブロック目(DESだと129~192bit) => 送金額とした場合…

暗号文1暗号文2 暗号文3

攻撃者はブロックを入れ替えるだけで改竄出来てしまう

Page 16: 第3回web技術勉強会 暗号技術編その1

CBCモード• Cipher Block Chainingモード(暗号ブロック連鎖モード)

• ひとつ前の暗号文ブロックと平文ブロックのXORをとってから暗号化を行う

出典: https://hibara.org/blog/2011/02/20/c-sharp-net-framework-aes/

Page 17: 第3回web技術勉強会 暗号技術編その1

CBCモード• 暗号化ブロックは前の暗号化ブロックの影響を受けるため、ECBと違って平文ブロックが同じであっても

暗号化ブロックが同じになるとは限らない

• 順番が入れ替わると復号化できないので、必然的に改竄ができない

• 暗号化ブロックが一つ破損すると、その暗号化ブロックと次の暗号化ブロックが復号化できなくなる

• 任意の暗号化ブロック内でビット欠損が発生すると、以降のブロックは全て復号化できなくなる

• 最初の暗号文ブロックを作成するための入力を初期化ベクトルと呼ぶ

• 初期化ベクトルは暗号化のたびに異なるランダムなビット列を使う

• 同じものを使うと「同じ平文を暗号化した」ことがバレてしまう

Page 18: 第3回web技術勉強会 暗号技術編その1

CBCモードではパディングが必要• CBCモードは平文ブロックに対して最後に暗号化する方式であり、その暗号化はブ

ロック単位で、足りない分はパディングする必要がある。※逆に平文に対してXORだけ取るようなモードではパディングが必要ない

• パディング方式• NoPadding

→パディングしない

• ZeroBytePadding→NULLバイト(0x00)でパディング

• PKCS#7 Padding→ブロック長に満たないサイズ(=埋めるサイズ)の値を表すバイト値で足りない分を埋める。一般的なパディング方法。

Page 19: 第3回web技術勉強会 暗号技術編その1

対称暗号方式の問題点• 鍵の配送問題

• どうやってセキュアに鍵を相手と共有するか

• 鍵の事前共有(USBメモリ等の物理媒体)

• 鍵配布センター

• Diffie-Hellman鍵交換

• 公開鍵暗号

Page 20: 第3回web技術勉強会 暗号技術編その1

余談1(IVの渡し方)• ApexのencryptWithManagedIV/decryptWithManagedIV

• 最初の16byte(=128bit)はInitVectorを表す

• 後ろは暗号化文字列

The algorithm requires an initialization vector of 16 bytes (128 bits). Use the encryptWithManagedIV() function to have Salesforce generate the IV for you in the first 16 bytes of the cipher text.Third party systems that receive the cipher should extract the IV from the first 16 bits. If third party systems send the IV in the first 16 bytes of the cipher, then use the decryptWithManagedIV() method to decrypt.

出典: https://developer.salesforce.com/page/Apex_Crypto_Class

Page 21: 第3回web技術勉強会 暗号技術編その1

余談1(IVの渡し方)• Pythonのpycryptoのサンプルもそんな感じ

https://www.dlitz.net/software/pycrypto/api/2.6/

from Crypto.Cipher import AESfrom Crypto import Random

key = b'Sixteen byte key'iv = Random.new().read(AES.block_size)cipher = AES.new(key, AES.MODE_CFB, iv)msg = iv + cipher.encrypt(b'Attack at dawn')

• PHPのmcryptのサンプルもそんな感じhttp://php.net/manual/ja/function.mcrypt-encrypt.php

# prepend the IV for it to be available for decryption$ciphertext = $iv . $ciphertext;

Page 22: 第3回web技術勉強会 暗号技術編その1

余談2(ECB使っても良さそうなケース)• LINEのChannel Web Application(CWA)のアクセストークンの暗号化はECB

• アクセストークンなので繰り返しの推測やブロックの入れ替えはどうでも良い

The encrypted string will be decoded using the Channel secret as a symmetric-key. The algorithm used is AES, the block size is 128 bit, the encryption mode is ECB, and the padding is PKCS#5. The Channel secret string will be interpreted as a hexadecimal byte string and used as the symmetric-key. The encrypted string follows Base64 encoding and will be restored once it has been decoded.

出典: https://developers.line.me/in_app_web/api-reference

Page 23: 第3回web技術勉強会 暗号技術編その1

• とりあえず 暗号技術入門 秘密の国のアリス(結城浩[著]) を読めばOK

• 暗号化は機密性、正真性、認証、否認不可能性のセキュリティ特性を高める重要な技術要素

• 暗号化を理解すれば世の中の色んな技術がわかるようになる

• 世界に公開されている強い暗号アルゴリズムを使って暗号化をしよう

• 対称暗号方式は同一の鍵を使って暗号化/復号化する方法

• ブロック暗号を使うときは適切なモードを使おう

まとめ

Page 24: 第3回web技術勉強会 暗号技術編その1

補足(XOR)• 排他的論理和

→オセロ的な計算

0 XOR 0 = 01 XOR 0 = 10 XOR 1 = 11 XOR 1 = 0

xxxxx XOR yyyyy = zzzzzzzzzz XOR yyyyy = xxxxx

Page 25: 第3回web技術勉強会 暗号技術編その1

補足(Base64エンコード)• バイナリ表現をテキスト表現に変換するエンコード方式

• 半角英字の大文字小文字+半角数字+記号(/, +)の64文字で構成される

• 6bitごとにバイナリを分割(3byteのバイナリは4つのブロックに分割される)

• 6bitに満たない分は0埋め

• 分割されたブロック数が4の倍数になるように”=“で調整(パディング)

01000001 01000010 01000011 01000100

010000 010100 001001 000011 010001 000000

Q U J D R A = =

A B C D

パディング0埋め