ToStringBuilder#reflectionToStringを拡張してフィールド値を暗号化する

ToStringBuilder#reflectionToStringは便利だし、ログ出力に使うこともよくあるけど、HTTPリクエスト情報のパスワードとか生で出力しちゃうとセキュリティ的に問題。 とかいって毎回パスワードだけ手動で暗号化処理をして出力させるってのも面倒くさいし、保守性も悪い。
ということで暗号化したいフィールドはアノテーションをつけて暗号化するようにすれば楽そう。ToStringBuilderをいじる。

Crypt.java

package am.ik.util.crypt.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Crypt {
    // 暗号化処理クラスをここで指定できるようにしたら良さそう
}

CryptReflectionToStringBuilder.java

package am.ik.util.crypt;

import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;

import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

import am.ik.util.crypt.annotation.Crypt;

public class CryptReflectionToStringBuilder extends ReflectionToStringBuilder {

	@SuppressWarnings("unchecked")
	public CryptReflectionToStringBuilder(Object object, ToStringStyle style,
			StringBuffer buffer, Class reflectUpToClass,
			boolean outputTransients, boolean outputStatics) {
		super(object, style, buffer, reflectUpToClass, outputTransients,
				outputStatics);
	}

	@SuppressWarnings("unchecked")
	@Override
	protected void appendFieldsIn(Class clazz) {
		// ReflectionToStringBuilder#appendFieldsInのコピペ...
		if (clazz.isArray()) {
			this.reflectionAppendArray(this.getObject());
			return;
		}

		Field[] fields = clazz.getDeclaredFields();
		AccessibleObject.setAccessible(fields, true);

		for (Field field : fields) {
			String fieldName = field.getName();
			if (this.accept(field)) {
				try {
					Object fieldValue = this.getValue(field);
					Crypt crypt = field.getAnnotation(Crypt.class);
					if (crypt != null) {
						// ここで適当な暗号化処理を行う
						fieldValue = "****";
					}
					this.append(fieldName, fieldValue);
				} catch (IllegalAccessException ex) {
					throw new InternalError(
							"Unexpected IllegalAccessException: "
									+ ex.getMessage());
				}
			}
		}
	}
}

CryptToStringBuilder.java

package am.ik.util.crypt;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

public class CryptToStringBuilder extends ToStringBuilder {
	public CryptToStringBuilder(Object object, ToStringStyle style,
			StringBuffer buffer) {
		super(object, style, buffer);
	}

	public static String reflectionToString(Object object) {
		return new CryptReflectionToStringBuilder(object, null, null, null,
				false, false).toString();
	}
}

出力例

public class CryptToStringBuilderTest {
	public static class Hoge {
		private final String name;
		@Crypt
		private final String password;

		public Hoge(String name, String password) {
			super();
			this.name = name;
			this.password = password;
		}

		public String getName() {
			return name;
		}

		public String getPassword() {
			return password;
		}

	}

	@Test
	public void test() {
		Hoge hoge = new Hoge("foo", "bar");
		System.out.println(CryptToStringBuilder.reflectionToString(hoge));
	}
}

出力すると

am.ik.util.crypt.CryptToStringBuilderTest$Hoge@2c64f6cd[name=foo,password=****]

Created at : 2010-01-31 20:22:59   Updated at : 2010-01-31 20:25:15
Category : Programming::Java

ベアボーンでCore i7マシン

[こちらから移行中]

Shuttle社から発売されたCore i7対応のベアボーン「SX58H7」で初めて自作PCに挑戦! (作成日 09/04/19)

スペック

部位パーツ名購入日
ベアボーンSX58H72009/04/18
CPUIntel Core i7-920 (D0ステッピング 2.66GHz)2009/04/18
メモリSP006GBLTU133S32 (DDR3 1333 6GB)2009/04/18
ストレージIntel X25-M Mainstream SATA SSD SSDSA2MH080G2C1 (80GB)2009/07/22
Intel X25-M Mainstream SATA SSD SSDSA2MH160G2C1 (160GB)2010/01/03
Seagateの何か (500GB)20??/??/??
グラフィックカードGF9800GT-E1GHD/GE (GeForce9800GT GDDR3 1GB)2009/04/18
ZT-20401-10L (GeForce GT240 DDR5 512M)2009/12/08
拡張スロットGV-MC7/VS2009/12/12
光学ドライブGH22NS402009/04/18
キーボードLenovo ThinkPlus USBトラベルキーボード2009/03/18
ThinkPad USB トラックポイントキーボード(日本語)2009/12/06
モニターW2253V-PF2009/03/22

写真

ドライブベイ入れる前

グラボを1スロット型に入れ替えてた。空きスロットに地デジチューナを。

この順番でしか認識しなかった…明らかに通気性悪し
スコア

変更履歴

2010-01-03
ここから移行
2010-01-31
SSDをSSDSA2MH080G2C1→SSDSA2MH160G2C1へ

Created at : 2010-01-03 00:36:07   Updated at : 2010-01-31 05:23:48
Category : 開発環境::PC

kumofsインストール

インストール環境

Fedora12 64bit

Tokyo Cabinetインストール

yumでインストールでけた

$ sudo yum -y install tokyocabinet tokyocabinet-devel

Message Packインストール

ソースから

$ wget "http://sourceforge.jp/frs/redir.php?m=osdn&f=%2Fmsgpack%2F45536%2Fmsgpack-0.4.1.tar.gz"
$ tar xzvf msgpack-0.4.1.tar.gz
$ cd msgpack-0.4.1
$ ./configure && make && sudo make install

kumofsインストール

# 前準備
$ sudo yum install -y openssl-devel rubygems # 必要だった
$ sudo gem install msgpack
# ここから
$ wget http://cloud.github.com/downloads/etolabo/kumofs/kumofs-0.3.1.tar.gz
$ tar xzvf kumofs-0.3.1.tar.gz
$ cd kumofs-0.3.1
$ ./configure && make && sudo make install

kumo-manager等に、もしlibmsgpack.soとかがリンクされていなかったら

$ sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf.d/local.conf'
$ sudo ldconfig

するとうまく行くかも。

動作確認

$ kumo-manager -v -l localhost -p localhost

で何か動いた。virt-cloneして分散環境作ってみたい。

Created at : 2010-01-23 05:41:49   Updated at : 2010-01-23 05:56:32
Category : Middleware::NoSQL::kumofs