パスワードを使用してオブジェクトを暗号化および復号化できるメソッドを作成しました。ただし、Java のネイティブ暗号化ライブラリを使用していますが、これらはあまり安全ではありません。(シリアル化しようとしているオブジェクトの小さな変更については、暗号化された合計 243 バイトのうち 208 バイトを取得します。) Shiroには代替手段があると思いますが、それらを見つけることができないようです (少なくとも 1.1.0 では)。パスワードベースの暗号化の場合)。これが暗号化のための私のコードです。パスワードの値をクラスに挿入し、単純にするために例外処理を省略しています。
public String encryptToString(Serializable object) {
SecretKeyFactory keyFactory =
SecretKeyFactory.getInstance(ALGORITHM);
KeySpec keySpec = new PBEKeySpec(password.toCharArray());
SecretKey secretKey = keyFactory.generateSecret(keySpec);
PBEParameterSpec paramSpec = new PBEParameterSpec(SALT, ITERATIONS);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec);
// Serialize map
final ByteArrayOutputStream byteArrayOutputStream =
new ByteArrayOutputStream();
CipherOutputStream cout =
new CipherOutputStream(byteArrayOutputStream, cipher);
ObjectOutputStream out = new ObjectOutputStream(cout);
out.writeObject(object);
out.close();
cout.close();
byteArrayOutputStream.close();
return new String(
Base64.encode(byteArrayOutputStream.toByteArray()));
}
そして、復号化するための私のコード:
public Object decryptToObject(String encodedString) {
SecretKeyFactory keyFactory =
SecretKeyFactory.getInstance(ALGORITHM);
KeySpec keySpec = new PBEKeySpec(password.toCharArray());
SecretKey secretKey = keyFactory.generateSecret(keySpec);
PBEParameterSpec paramSpec = new PBEParameterSpec(SALT, ITERATIONS);
Cipher decipher = Cipher.getInstance(ALGORITHM);
decipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);
final ByteArrayInputStream byteArrayInputStream =
new ByteArrayInputStream(Base64.decode(encodedString
.getBytes()));
CipherInputStream cin =
new CipherInputStream(byteArrayInputStream, decipher);
ObjectInputStream in = new ObjectInputStream(cin);
Object result = in.readObject();
in.close();
cin.close();
byteArrayInputStream.close();
return result;
}