jCryptionはウェブページのフォームデータをHTTPでPOSTする際に、データをRSA/AESで暗号化してサーバーに送信するjQueryのプラグインライブラリです。
jCryption.NETはjCryptionの送信した暗号データをサーバーで復号化するためのASP.NET用のライブラリです。
ログインフォーム、問い合わせフォーム、アンケートフォームなど、ウェブページ上で利用者の入力を受けサーバーへデータを送信する場面は多くあります。一方で、個人情報、IDやパスワードなど他者に見られたくない内容を含む場合、そのフォーム送信は「暗号化」によって保護された状態で送信されるべきで、通常、平文通信であるHTTPでの送信は避けHTTPSで保護されるべきです。しかし、HTTPS/SSLの通信をサポートするためには高額(ベリサインの場合8万円程度)のサーバー証明書のための費用とウェブサーバーのIPアドレスを一つ独占するというコストがかかり、ちょっとしたアンケートフォームなどの目的には導入を躊躇する場面もあります。
本格的にウェブサーバーとの通信にHTTPS/SSLを導入することなく、クライアントからサーバーへ送信される情報を暗号化により保護しようというのがjQueryのプラグインであるjCryptionというJavascriptのライブラリのコンセプトです。
一般にHTTPS/SSLには
の2種類の目的がありますが、jCryptionは2つ目の通信中のデータの暗号化のみをサポートします。
jCryptionが使用する暗号は RSA/AESで、RSAはクライアント側で生成されたAESの鍵を暗号化してサーバーへ送信するために使われます。実際にPOSTされるフォームのデータはAESで暗号化されて送信されます。
これから先のjCryptionそのものの詳しい内容は本家のウェブサイトに譲ります。http://www.jcryption.org/(英語)
ここでは、jCryption.NETを使った例を紹介します。
クライアント側の使用法は本家で解説されているように、jQueryとjCryptionのライブラリを<script>で読み込み
$(“#form”).jcryption(….)
で指定したフォームをjCryption対応にセットします。
このフォームを送信するにあたって、暗号の鍵の交換、データの解読にサーバー側のプログラムが必要になります。本家のパッケージではPHPやPerl CGIによる実装がすでに含まれています。ここでは、Windows Server + IIS + ASP.NETな環境でサーバー側の実装を紹介します。
<%@ Language="C#" Inherits="jCryption.SecurePage" %> <html> <head> <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> <script type="text/javascript" src="Scripts/jquery.jcryption.3.1.0.js"></script> <script type="text/javascript"> $(function () { $("#normal").jCryption({ getKeysURL: "<%= Request.Path %>?getPublicKey=true", handshakeURL: "<%= Request.Path %>?handshake=true" }); }); </script> </head>
@using jCryption @{ jCryption.HandleRequest(Request); } <!doctype html> <html> <head> <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> @jCryption.RenderScriptFor("#normal", src: "Scripts/jquery.jcryption.3.1.0.js") </head> ...... <form id="normal"> ..... </form> ......
jCryption.NETをcshtmlで使用する場合に、フォームデータと、HTMLテキストの暗号化にも対応しています。もともとjCryptionはクライアントからサーバーへ送信されるデータの保護を目的としていますが、ログインIDやパスワード、住所氏名などはフォーム上であらかじめわかっている内容を入れてHTML出力されることがあります。この場合HTTPのままですと、データは平文で保護されておらず、片手落ちとなります。
jCryption を利用するFORMをjQueryのセレクタで指定します。この呼び出しは通常 head タグか body 内最後の方に配置します。jquery.validate と同時に使用する場合は jquery.validate を読み込む script タグの後になるようにします。
selector: jCryptionで初期化する対象のFORMを jQuery のセレクタで指定します。
src: jCryption のjsファイルへのパスを指定します。
script: その他のjavascriptが必要な場合に <script>...</script>を含むHTMLを指定します。
フォーム要素の初期状態で表示されるデータを保護します。<input> タグ内に記述します。.
<input type='text' @jCryption.SecureNameValue("Name", "Smith") />
input タグの name と value を引数に指定します。
@jCryption.SecureNameValueCheck( String name, String value, bool check )
input の checkbox radiobutton に対応したバージョンです。
<input type='checkbox' @jCryption.SecureNameValueCheck("Animal", "Dog", true ) />
<input type='checkbox' @jCryption.SecureNameValueCheck("Animal", "Cat", false ) />
暗号化されたテキストコンテンツを設定します。HTML内の任意の位置に記述可能です。<div>で囲まれ暗号化データとともにHTMLとして出力されます。
暗号化されたHTMLコンテンツを設定します。HTML内の任意の位置に記述可能です。<div>で囲まれ暗号化データとともにHTMLとして出力されます。
@jCryption.LoadSecureContents()
SecureNameValue/SecureNameValueCheck/SecureText/SecureHtml の内容を保護された実際のデータをDOM要素中に読み込むことを指示します。上記4種類メソッド呼び出しの一番最後にこの呼び出しを追加してください。
最後に本家jCryptionに見られるいくつかの技術的問題点を指摘しておきます。