22
Javascript Javascript で暗号化 で暗号化 無料で可能な限りセキィを高める。 2013/06/08

Javascript で暗号化

  • Upload
    suno88

  • View
    19.901

  • Download
    0

Embed Size (px)

DESCRIPTION

NSEG 第 40 回勉強会で、mebius こと砂原昌史さんが発表でお使いになったスライドを代理でアップロードしました。

Citation preview

Page 1: Javascript で暗号化

JavascriptJavascript で暗号化で暗号化

無料で可能な限りセキュリティを高める。

2013/06/08

Page 2: Javascript で暗号化

自己紹介自己紹介

� 情強そば屋の中の人こと砂原 昌史� そば屋五兵衛の店主 砂原 謙一(父)� 現在⼆級在宅⼠とプログラミングの⽇々◦ そろそろ本気出したい◦ 最近は C#(WPF) いじってます

� 言語◦ メイン:html, css, javascript, PHP, C#◦ メイン:html, css, javascript, PHP, C#◦ サブ:perl, powershell◦ たしなむ程度:ruby, python◦ 忘れつつある:vbs◦ ほぼ忘れた:C

� 松本経済新聞の記事は一部誤りが。◦ 過去にプログラマーはしたことありません。

Icons by http://dryicons.com

Page 3: Javascript で暗号化

目次目次

� 五兵衛 web サイトの履歴� 通販システムの問題点� 暗号技術に触れる� SSL/TLS� 呼べば答えるインターネット呼べば答えるインターネット� 暗号� 暗号鍵作成 – OpenSSL� 復号� Pros, Cons� まとめ

Icons by http://dryicons.com

Page 4: Javascript で暗号化

五兵衛五兵衛 web web サイトの履歴サイトの履歴

� www.sobaya-gohei.com� 90 年代後半 ホームページ開設。◦ 当初は父が作成&管理◦ Web サイトはプロバイダーのホームページスペースに設置

� 200x プロバイダ乗り換えで CGI (perl) 使用可能に。◦ 通販ページ作成◦ 通販ページ作成◦ メール投稿スクリプトを拾ってきてカスタマイズ

� 2003 クロネコ@ペイメント対応� 200x ドメイン取得 (さくらインターネット : ライトプ

ラン[最安])� 2010 サイトリニューアル� 2013 クロネコ web コレクト対応

Page 5: Javascript で暗号化

通販システムの問題点通販システムの問題点

� お客様の情報が平分のままネットワークに流れる� もちろん SSL 使えない。� さくらインターネットの共用 SSL はスタンダードプラ

ン以上 (ドメイン名と違うのでどのみち使えない)� 少なくとも通販システムの管理をしているからには情

報漏洩があった場合の責任問題に!報漏洩があった場合の責任問題に!� 何か対策をしたい。� 高まる暗号化への思い(個人的に)

Icons by http://dryicons.com

Page 6: Javascript で暗号化

暗号技術に触れる暗号技術に触れる

� 2006 就職。LAN ドライバの評価に携わる。◦ -無線 LAN との出会い-

� 評価の仕事だったので詳しいことは知る必要はないが……◦ やはり技術的なことは気になる◦ 認証、暗号化、証明書などを調べる

� 無線 LAN にも SSL/TLS と同じ仕組みが!� これをなんとかして通販システムに組み込む術はないか?と� これをなんとかして通販システムに組み込む術はないか?と

考え始める� でも普通 WEB サイトの暗号化といえば HTTPS, SSL/TLS

だよね!

•ちなみに無線 LAN の認証方式にも TLS が登場します。•EAP-TLS, PEAP-TLS, PEAP-GTC(内部認証としての TLS)

Icons by http://dryicons.com

Page 7: Javascript で暗号化

SSL/TLSSSL/TLS

� + VPS とか……

サービスサービスサービスサービス会社会社会社会社 商品名商品名商品名商品名 価格価格価格価格

VeriSign セキュアサーバーID 85050 円/YearGlobalSign クイック認証 SSL 36540 円/YearGeoTrust クイック SSL プレミアム 36540 円/Year

+ VPS とか……◦ さくらのVPS 1G 980/Month, 10780/Year

� 格安証明書もありますが……� 地方の零細企業にとってはちょいと敷居が高い。

•貧乏人は頭を使え! javascript で暗号化すればよくね?•CGI で疑似 SSL/TLS という手もあるが、オレオレ証明書に代わりはないので javascript で出来るならそれだけで済ませたい。

Icons by http://dryicons.com

Page 8: Javascript で暗号化

呼べば答えるインターネット呼べば答えるインターネット

� ⾞輪の再発明は避ける� 世界には同じようなことを考えた人がいるはず!� いろいろ検索していて、AES として sjcl に、公開鍵暗

号(RSA) として Tom Wu 氏のライブラリにたどり着く。SJCL : Stanford Javascript Crypto Library� SJCL : Stanford Javascript Crypto Library

� 公開鍵暗号の js 実装は他にもいろいろあるみたいです。� javascript での AES は sjcl がスタンダードっぽい。

Icons by http://dryicons.com

Page 9: Javascript で暗号化

暗号暗号暗号暗号暗号暗号暗号暗号

Page 10: Javascript で暗号化

暗号について暗号について

� 共通鍵暗号◦ 2000年以上の歴史を持つ基本的な暗号化方式。◦ データを鍵で暗号化。復号化するときも同じ鍵を使う。◦ DES, AES, RC4 など◦ 現在 AES が一般的◦ Camellia なんてのもある (OpenSSL.org とか)

� 公開鍵暗号� 公開鍵暗号◦ 公開鍵で暗号化したものは秘密鍵でのみ復号でき、秘密鍵で暗号化

したものは公開鍵でのみ復号できる。◦ わりと最近発⾒された新たな暗号化方式。RSA など◦ 素因数分解の難解さと関連する暗号化方式。◦ 公開鍵 n = p*q (p, q は素数)◦ p, q は秘密鍵⽣成にも利用されるが、巨⼤な n からは p と q を

導きだすのは困難。(参考:wikipedia RSA暗号)� これを両方使います。

Icons by http://dryicons.com

Page 11: Javascript で暗号化

なぜ2種類使うのか?なぜ2種類使うのか?

� 共通鍵暗号 (AES)◦ 暗号化は簡単だ。だがパスフレーズをどうやって受け取る?

� 公開鍵暗号 (RSA)◦ 暗号化できるデータの⻑さが鍵⻑によって決まってしまう!

どうするか?

�両方使え!�データは AES で暗号化�パスフレーズは短いので RSA で暗号化 これを両方送る。

Icons by http://dryicons.com

Page 12: Javascript で暗号化

暗号鍵作成暗号鍵作成 -- OpenSSLOpenSSL� Tom Wu 氏のライブラリで使う RSA のキーペアは事

前に OpenSSL にて作成します。� 鍵作成コマンド : test.key という名前で鍵⻑が

2048bit の場合◦ openssl genrsa -out test.key 2048

� 鍵情報表示 (公開鍵、秘密鍵含めてすべて)◦ openssl rsa -in test.key –text◦ openssl rsa -in test.key –text

◦ 実際に使用する際は : とかスペースなどを取って使います。� Modulus (公開鍵) 表示◦ openssl rsa -in test.key -noout –modulus

◦ これで出⼒される 16 進数⽂字列をそのまま使います。

Icons by http://dryicons.com

Page 13: Javascript で暗号化

暗号化手順暗号化手順

1. パスフレーズ作成 (for AES)2. データの暗号化 - AES3. パスフレーズの暗号化 - RSA

お客様端末での処理

Icons by http://dryicons.com

Page 14: Javascript で暗号化

パスフレーズ作成パスフレーズ作成

� 自動⽣成。� 英数字といくつかの記号から導出。◦ 通販ページではお客様のメールアドレスも利用

� 乱数◦ 古いブラウザでは Math.random()◦ 新しいブラウザでは

window.crypto.getRandomValues()新しいブラウザではwindow.crypto.getRandomValues()◦ Firefox21 で対応になったので取り入れてみました。

Chrome, Safari では結構前から対応していたようです。� このパスフレーズは実際の暗号に使う鍵の元になる。

Icons by http://dryicons.com

Page 15: Javascript で暗号化

データの暗号データの暗号 AESAES� var encData = sjcl.encrypt(passWord, rawData, PARAM);◦ passWord, rawData : ⽂字列◦ PARAM : オブジェクト。オプションです。◦ 例) {adata:"", iter:1000, mode:"ccm", ts:128, ks:256};◦ Adata : データ確認用の⽂字列。ccm モードの機能。空⽂字でも OK◦ Iter : PBKDF2 で使用。通常は 1000 で十分な模様◦ mode AES にはいろんな暗号モードがありますが、sjcl がサポートするのは

ccm と ocb2CCM : [CounterMode with CBC-MAC] RFC3610

ccm と ocb2� CCM : [CounterMode with CBC-MAC] RFC3610� MAC : Message Authentication Code� カウンターモードと CBC-MAC を組み合わせた方式� メッセージを分割し、CBC-MAC で MAC 作成。MAC 処理で⽣成されたタグ+メッ

セージをカウンターモードで暗号化。� http://www.cryptrec.go.jp/estimation/rep_ID0205.pdf 35Pより� OCB2 : ccm より高速だが特許絡みで避けられることが多いようだ。

◦ Ts : (authentication) tag size 64(bit) で十分らしいが、128(bit) にしています。MAC のサイズ。

◦ Ks : Kye Size AES キーのサイズ。

Icons by http://dryicons.com

Page 16: Javascript で暗号化

データの暗号データの暗号 RSARSA� var rsa = new RSAKey();//1

� rsa.setPublic(PUB_KEY, EXP);//2

� var encPW = rsa.encrypt(passWord);//3◦ 1.RSAKey のインスタンス作成。◦ 2.公開鍵とエクスポーネントの設定。両方⽂字列

� exponent 暗号指数 "10001" が一般的。0x010001。◦ 3.encrypt メソッドに暗号化したい⽂字列を入れると 16 ◦ 3.encrypt メソッドに暗号化したい⽂字列を入れると 16

進数形式の⽂字列が出てきます。

Icons by http://dryicons.com

Page 17: Javascript で暗号化

復号復号

� RSA 鍵情報のすべてを使います。� var rsa = new RSAKey();

� rsa.setPrivateEx(n,e,d,p,q,dmp1,dmq1,coeff);

� var result = rsa.decrypt(encData);◦ n:pubKey(modulus)◦ e:exponent(publicExponent)◦ d:privateKey(privateExponent)

e:exponent(publicExponent)◦ d:privateKey(privateExponent)◦ p, q:prime1, 2◦ dmp1, dmp2:exponent1, 2◦ coeff:coefficient

� var original = sjcl.decrypt(result, encData);

Icons by http://dryicons.com

Page 18: Javascript で暗号化

PROS, CONSPROS, CONSメリット、デメリットを SSL/TLS, js 暗号, 無対策で

比較

Page 19: Javascript で暗号化

SSL/TLS Js 暗号化

1. 有料2. 証明書の偽造、詐称などを検出するための

認証機能を持つ。(プロトコルの脆弱性に注意)

3. 暗号化の保証は web サーバーまで。その後は……

4. ブラウザの javascript 設定に無関係。ただしプロトコルはブラウザや OS の設定などに強く影響を受ける。

◦ Firefox TLS 1.0◦ Chrome TLS 1.1◦ Opera TLS 1.2

1. 無料2. MITM 攻撃の可能性◦ 店頭でオレオレ証明書を配布する方法もあるが、

非現実的すぎる。3. メールでデータを受け取るまで暗号化。4. javascript が有効になっていないと使えな

いが、ブラウザに関係なく AES とか使える。5. js ライブラリの検証等がなされていない。

たとえ検証されていても、スクリプトダウンロード中での MITM 攻撃やサーバークラックに弱い

◦ 復号失敗が発⽣した場合、原因が不明瞭

SSL/TLS SSL/TLS とととととととと jsjs 暗号化暗号化暗号化暗号化のののの比較比較比較比較暗号化暗号化暗号化暗号化のののの比較比較比較比較

◦ Opera TLS 1.2◦ IE は OS に依存。Windows7 以降なら TLS

1.2 使用可能。※◦ iOS 5 TLS 1.2◦ android TLS 1.0?

5. 信頼性 : OpenSSL, NSS など FIPS 140 validated

◦ 復号失敗が発⽣した場合、原因が不明瞭� スクリプトのバグ?� MITM 攻撃された?� サーバーがクラックされた?� どこかでデータの改ざんがあった?

◦ W3C で Web Cryptography API が策定中なので、これが勧告されて実装されれば改善される

※ mmc のグループポリシーオブジェクトエディタにて[コンピュータの構成¥Windows の設定¥セキュリティの設定¥ローカルポリシー¥セキュリティオプション]にある[システム暗号化: 暗号化、ハッシュ、署名のための FIPS 140 準拠暗号化アルゴリズムを使う] を有効にする必要がある。ただしこれを⾏うと RC4 が使用不可になる模様

Icons by http://dryicons.com

Page 20: Javascript で暗号化

Js 暗号化 無対策

1. 無料2. MITM 攻撃の可能性◦ 店頭でオレオレ証明書を配布する方法もあるが、

非現実的すぎる。3. メールでデータを受け取るまで暗号化。4. javascript が有効になっていないと使えな

いが、ブラウザに関係なく AES とか使える。5. js ライブラリの検証等がなされていない。

たとえ検証されていても、スクリプトダウンロード中での MITM 攻撃やサーバークラックに弱い

◦ 復号失敗が発⽣した場合、原因が不明瞭

1. 無料2. MITM ほかあらゆる攻撃に無防備3. 暗号化無し。サーバー、ネットワーク

経路双方に死角あり。4. どの端末でもフォームは送信可能。5. --

Js Js 暗号化暗号化暗号化暗号化とととと無対策無対策無対策無対策のののの比較比較比較比較暗号化暗号化暗号化暗号化とととと無対策無対策無対策無対策のののの比較比較比較比較

◦ 復号失敗が発⽣した場合、原因が不明瞭� スクリプトのバグ?� MITM 攻撃された?� サーバーがクラックされた?� どこかでデータの改ざんがあった?

◦ W3C で Web Cryptography API が策定中なので、これが勧告されて実装されれば改善される

Icons by http://dryicons.com

Page 21: Javascript で暗号化

まとめまとめ

� SSL/TLS の方がセキュリティは高いですが、脆弱性も⾒つかっているので注意。◦ パッチやアップデートの適用を。

� Js 暗号化に穴がいくつかありますが、やらないよりはまし◦ ぬののふく <<< くさりかたびら

� ライブラリの中身を確認した上で通常の SSL/TLS と組み合わせてさらに上のセキュリティを目指すのもありかと。わせてさらに上のセキュリティを目指すのもありかと。◦ Web Cryptography API にも期待

� !注意点!� 両ライブラリとも BSD ライセンスであり、「無保証」です。� テストは重要。◦ 五兵衛では少なくとも 50 件 (通販) 以上の復号で失敗は無し。

2013/05

Icons by http://dryicons.com

Page 22: Javascript で暗号化

ありがとうございました。

砂原 昌史