S2Utilでハッシュ値を得る

可逆な暗号化をする場合はCipherPoolUtilを使えば良いですが、一方向ハッシュ化して可逆じゃない文字列を得たい場合はMessageDigestUtilを利用します。用途的にはパスワードをハッシュ化して保存したりするのに使ったりとかでしょうか。

使いかたは簡単です。digestメソッドを呼ぶだけです。以下のような感じです。

String text = "パスワード";
String value = MessageDigestUtil.digest("MD5", text);

第一引数にアルゴリズムを指定して、第二引数にハッシュ化したい文字列を記述します。戻り値は文字列をハッシュ化された文字列です。アルゴリズムには SHA-256 など使えます。詳しくはjava.security.MessageDigestのjavadocで使えるアルゴリズムを確認してください。

S2Utilで暗号化・復号化

暗号化や復号化をやるためにCipherを使ってあれこれする機会って、結構あるかと思うのだけど、生Cipherを使うのにもスレッドセーフじゃなかったり悩みどころもあるような、ないような…。というわけで、S2UtilにCipherPoolUtilというUtilを加えておきました。使い方も簡単です。

基礎

CipherPoolUtilクラスを使うにはCipherContextインターフェースっていう、どんな暗号化や復号化をするのかの情報をもつクラスが必要になります。標準でCipherContextImplという実装クラスがあるので、基本的なことであればこれで対応できるかと思います。難しい暗号化とかしたい場合はCipherContextを自分で実装してください(^^;
まず、CipherContextをどこかに定数として定義しておきます。CipherContextImplの引数はjavax.crypto.Cipherを生成するときに利用する、アルゴリズムと暗号化キーになります。使えるアルゴリズムについてはjavax.crypto.CipherのJavaDocなどを確認してください。

public static final CipherContext BLOWFISH_CONTEXT =
new CipherContextImpl("Blowfish", "hogefuga");

暗号化

まず、文字列を暗号化する場合を以下に示します。ここでは「パスワード」という文字列を暗号化しています。

String encryptoText1 =
CipherPoolUtil.encryptoText(BLOWFISH_CONTEXT, "パスワード", "UTF-8");

CipherContextを定義しておけば、あとはCipherPoolUtilでencryptoTextメソッドを呼び出します。第二引数に暗号化したい文字列、第三引数にその文字列のエンコーディングを渡すと、暗号化された文字列が返ります。

復号化

使い方は暗号化のときと同様です。

String decryptoText1 =
CipherPoolUtil
.decryptoText(BLOWFISH_CONTEXT, encryptoText1, "UTF-8");

decryptoTextメソッドを利用します。第二引数に暗号化された文字列を渡し、第三引数に文字列にするときのエンコーディングを指定します(javax.crypto.Cipherはバイナリとして扱うため)。戻り値は復号化された文字列になります。

初期化

javax.crypto.Cipherは初期化のコストがあります。そのため、CipherPoolUtilではインスタンスをプールしています。CipherPoolUtilでインスタンスの初期化しない場合は必要時にjavax.crypto.Cipherが生成されます。事前にプールしておくには以下のようにします。

CipherPoolUtil.create(BLOWFISH_CONTEXT, 5);

第二引数がプールしておくインスタンス数になります。

commons-fileupload 1.2.1を使うには

SASTRUTS-128 で登録したのだけど、SAStruts で commons-fileupload 1.2.1 を使うと、アップロード時に一時ファイルが作成されたら、それを自動削除する機能が動きませぬ。まぁ、そもそもは commons-fileupload が 1.2 から 1.2.1 に上がったときに仕組みを変えるという、結構、大胆な感じなことをやってくれたため。そんなわけで、commons-fileupload 1.2.1 を利用したい場合にはどうすべきか。Fess では早速対応してみた。

まず、FessMultipartRequestHandler みたいなものを用意して、commons-fileupload 1.2.1 に対応する必要がある。これ を参照。そんで、web.xmlに追加する。

<listener>
<listener-class>org.apache.commons.fileupload.servlet.FileCleanerCleanup</listener-class>
</listener>

さらに、struts-config.xmlを以下のように変更しておく。

<controller
maxFileSize="1024K"
bufferSize="1024"
processorClass="org.seasar.struts.action.S2RequestProcessor"
multipartClass="jp.sf.fess.upload.FessMultipartRequestHandler"/>

以上。