prePersist()
データベース属性の一部を(Morphia を使用して) エンティティのゲッターで透過的に暗号化/復号化しています。エンティティをきれいに保つために、静的メソッドを使用しています。次のようになります。
@Override
@PrePersist
public void prePersist() {
super.prePersist();
if(password != null){
if(passwordEncrypted == null){
passwordEncrypted = new EncryptedString();
}
passwordEncrypted.setEncryptedAttribute(AESEncryptor.encrypt(password, passwordEncrypted.getSalt()));
}
}
postLoad()
暗号化された属性は必ずしも必要ではなく、パフォーマンスのオーバーヘッドを回避したいため、メソッドで復号化していないことに注意してください。残念ながら、 http://invariantproperties.com/2012/11/25/database-encryption-using-jpa-listeners/@EntityListener
で説明されているように、これは除外されます。
public String getPassword() {
if((password == null) && (passwordEncrypted != null)){
password = AESEncryptor.decrypt(passwordEncrypted.getEncryptedAttribute(), passwordEncrypted.getSalt());
}
return password;
}
ここで、暗号化パスワードをプロパティ ファイルに保持し、正しいプロファイル (prod、stage、dev) からのパスワードをロードする必要があります。
暗号化コードは次のようにgetPassword
なります。Spring 経由でロードする必要があります。
public static String encrypt(String input, String salt) {
TextEncryptor encryptor = Encryptors.text(getPassword(), salt);
String cipher = null;
try {
cipher = encryptor.encrypt(input);
} catch(Exception e){
LOG.error("Could not encrypt the input '{}', be sure to check the password for illegal characters", input);
}
return cipher;
}
Spring で静的変数をロードすることは可能ですが (たとえば、http://www.connorgarvey.com/blog/?p=105 )、これはかなりハックであり、ほとんどの場合推奨されません。さらに、これがガベージ コレクションの問題を引き起こさない可能性があるかどうかはわかりません。
これを正しく行うにはどうすればよいですか?