- UI を実行するユーザーがパスワードを知っている場合、セキュリティ上の懸念はありません。あなたは誰から守っていますか?
- UI を実行するユーザーがパスワードを知らない場合 (そして、パスワードはテストケース自体に保存する必要があります)、あなたは窮地に陥っています - 暗号化は良いことですが、何らかの方法で復号化するためにパスワードを保存する必要があります ...終わりのない円、安全な場所はありません。保存が安全であっても、弱点は間違いなくブラウザーへの転送 (何があっても JSON にカプセル化されたプレーン文字列として行われます) と、ブラウザー自体への自動入力です。真剣に、テストが実行されるマシンを信頼しない場合は、パスワードを保存しないでください。
ただし、最初のケース (ユーザーが UI にパスワードを入力する必要がある場合) では、脅威の可能性を最小限に抑え、利便性を最大限に高めるために、次のようにします。
- シングルトンクラスを作成する
PasswordHolder
- aまたはでパスワード (によって与えられた)
PasswordHolder
を記憶します。ここで、キーはパスワード識別子であり、値はパスワード自体です。JPasswordField
Map<String, char[]>
Map<String, Password>
getPassword()
パスワードがメソッドを介してアクセスされると、その内容は無効になります
簡単なサンプル実装 (重要なものを含めることを忘れないことを願っているので、さらなる改善のために... しかし、それは起こる可能性があります)。私はそれがちょっとそれ自体を物語っていると思います:
public class PasswordHolder {
private static PasswordHolder instance = null;
private final Map<String, Password> map = new HashMap<String, Password>();
private PasswordHolder() {
// nothing to do
}
public static PasswordHolder getInstance() {
if (instance == null) {
instance = new PasswordHolder();
}
return instance;
}
public void addPassword(String name, char[] pass) {
if (map.containsKey(name)) {
// throw some sort of Exception("Duplicate password name, man.")
}
map.put(name, new Password(pass));
}
public Password getPassword(String name) {
return map.get(name);
}
}
最も便利なこととして、私は と書いPassword
たCharSequence
ので、 で便利ですsendKeys(CharSequence keys)
。残念ながら、sendKeys()
は を使用toString()
するため、とにかくパスワードから String を作成する必要があります (これは悪い習慣と見なされます)。
public class Password implements CharSequence {
private final char[] pass;
private final BitSet nulled;
Password(char[] pass) {
this.pass = pass;
nulled = new BitSet(pass.length);
}
private void nullify(int start, int end) {
for (int i = start; i < end; i++) {
pass[i] = '\0';
}
nulled.set(start, end);
}
@Override
public int length() {
return pass.length;
}
@Override
public char charAt(int index) {
if (nulled.get(index)) {
// throw some Exception("That character has already been read!")
}
char ret = pass[index];
pass[index] = '\0';
nulled.set(index);
return ret;
}
@Override
public CharSequence subSequence(int start, int end) {
if (nulled.get(start, end).cardinality() > 0) {
// throw some Exception("Some of the characters has already been read!")
}
Password subPass = new Password(Arrays.copyOfRange(pass, start, end));
nullify(start, end);
return subPass;
}
@Override
public String toString() {
if (nulled.cardinality() > 0) {
// throw some Exception("Some of the characters has already been read!")
}
String str = new String(pass);
nullify(0, pass.length);
return str;
}
}