ToStringBuilder#reflectionToStringは便利だし、ログ出力に使うこともよくあるけど、HTTPリクエスト情報のパスワードとか生で出力しちゃうとセキュリティ的に問題。
とかいって毎回パスワードだけ手動で暗号化処理をして出力させるってのも面倒くさいし、保守性も悪い。
ということで暗号化したいフィールドはアノテーションをつけて暗号化するようにすれば楽そう。ToStringBuilderをいじる。
package am.ik.util.crypt.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface Crypt {
// 暗号化処理クラスをここで指定できるようにしたら良さそう
}
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());
}
}
}
}
}
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
[こちらから移行中]
Shuttle社から発売されたCore i7対応のベアボーン「SX58H7」で初めて自作PCに挑戦! (作成日 09/04/19)
| 部位 | パーツ名 | 購入日 |
|---|---|---|
| ベアボーン | SX58H7 | 2009/04/18 |
| CPU | Intel Core i7-920 (D0ステッピング 2.66GHz) | 2009/04/18 |
| メモリ | SP006GBLTU133S32 (DDR3 1333 6GB) | 2009/04/18 |
| ストレージ | 2009/07/22 | |
| Intel X25-M Mainstream SATA SSD SSDSA2MH160G2C1 (160GB) | 2010/01/03 | |
| Seagateの何か (500GB) | 20??/??/?? | |
| グラフィックカード | 2009/04/18 | |
| ZT-20401-10L (GeForce GT240 DDR5 512M) | 2009/12/08 | |
| 拡張スロット | GV-MC7/VS | 2009/12/12 |
| 光学ドライブ | GH22NS40 | 2009/04/18 |
| キーボード | 2009/03/18 | |
| ThinkPad USB トラックポイントキーボード(日本語) | 2009/12/06 | |
| モニター | W2253V-PF | 2009/03/22 |
ドライブベイ入れる前
グラボを1スロット型に入れ替えてた。空きスロットに地デジチューナを。

この順番でしか認識しなかった…明らかに通気性悪し
スコア
Fedora12 64bit
yumでインストールでけた
$ sudo yum -y install tokyocabinet tokyocabinet-devel
ソースから
$ 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
# 前準備 $ 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