Java 将密码传递给junitcore

Java 将密码传递给junitcore,java,selenium,Java,Selenium,我正在开发一个独立的应用程序,用SeleniumWebDriver测试一个网站。应用程序将使用JavaFX或Swing UI来允许用户加载测试套件文件,并选择要运行的测试以及要在哪个浏览器中运行它们。UI还将捕获测试使用的数据,例如用户名和密码 我计划使用JUnitCore来运行所选的测试类,但我需要将数据从UI传递到测试类。对于大多数数据,我可以使用System.setPropertyprop,value来完成此操作。然而,我还需要通过管理员,和其他,该网站的测试密码 将密码传递给测试的最佳方

我正在开发一个独立的应用程序,用SeleniumWebDriver测试一个网站。应用程序将使用JavaFX或Swing UI来允许用户加载测试套件文件,并选择要运行的测试以及要在哪个浏览器中运行它们。UI还将捕获测试使用的数据,例如用户名和密码

我计划使用JUnitCore来运行所选的测试类,但我需要将数据从UI传递到测试类。对于大多数数据,我可以使用System.setPropertyprop,value来完成此操作。然而,我还需要通过管理员,和其他,该网站的测试密码

将密码传递给测试的最佳方式是什么

使用System.setProperty存储密码时会有什么安全问题?我应该加密数据并将其存储在文件中,让测试读取文件并解密数据吗?这显然会增加设置每个测试所需的处理量

如果运行UI的用户知道密码,那么我真的看不出您的安全问题。你在为谁辩护? 如果运行UI的用户不知道密码,并且密码应该存储在测试用例中,那么您就陷入了困境-加密是好的,但是您必须以某种方式存储密码以便解密。。。无尽的循环,没有安全的空间。即使存储是安全的,缺点肯定是传输到浏览器,无论发生什么情况,都将以JSON封装的纯字符串的形式进行,并且自动输入到浏览器本身。说真的,如果你不信任运行测试的机器,就不要存储密码。 然而,对于第一种情况,当用户必须在UI中键入密码时,为了最大限度地减少威胁的可能性,也为了最大限度地方便,我会这样做:

创建一个类密码持有者 密码持有者会记住地图或地图中的密码,其中键是某个密码标识符,值是密码本身 一旦通过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);
    }

}

此外,我还希望看到并获得用于测试的UI;非常感谢你的帮助。运行该程序的用户将知道密码,因此我明白您的观点,即我将保护他们不受谁的攻击。这是为了我自己的学术兴趣,但如果我开发了一些通常有用的东西,而不仅仅是一个特定的网站,我会与大家分享。这就是我的想法,也是我写这些课程时所依赖的。在任何情况下,都要尽量缩短密码的使用期限,尽量避免使用字符串,如果您觉得这也是一个很好的练习,请添加简单的加密!。还有一个新的密码实现。
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;
    }

}