我正在开发一个独立的应用程序来使用Selenium Webdriver测试网站。应用程序将使用JavaFX或Swing,UI来允许用户加载测试套件文件并选择要运行的测试以及运行它们的浏览器.UI还将捕获测试使用的数据,例如用户名和密码。
我打算使用JUnitCore来运行选定的测试类,但我需要将数据从UI传递给测试类。对于大多数数据,我可以使用System.setProperty(prop,value)来完成此操作。但是,我还需要将网站的管理员和其他密码传递给测试
将密码传递给测试的最佳方法是什么?
使用System.setProperty存储密码时会出现什么安全问题?我应该加密数据并将其存储在一个文件中并让测试读取文件并解密数据吗?这显然会增加设置每个测试所需的处理量
答案 0 :(得分:0)
然而,对于第一种情况(当用户必须在UI中输入密码时),为了最大限度地降低威胁的可能性并且为了最大程度的方便,我会这样做:
PasswordHolder
PasswordHolder
会记住Map<String, char[]>
或Map<String, Password>
中的密码(given to them by JPasswordField
),其中密钥是密码标识符,值是密码本身getPassword()
方法it's contents would get nullified 快速实施示例(为了进一步改进,我希望我不会忘记包含任何重要内容......但可能会发生)。我认为它有点说不出话来:
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()
,所以你必须从密码中删除一个字符串(这被认为是一种不好的做法)。
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;
}
}