gpt4 book ai didi

java - 将密码传递给junitcore

转载 作者:行者123 更新时间:2023-12-01 05:18:28 25 4
gpt4 key购买 nike

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

我计划使用 JUnitCore 来运行选定的测试类,但我需要将数据从 UI 传递到测试类。对于大多数数据,我可以使用 System.setProperty(prop, value) 来完成此操作。但是,我还需要将网站的管理员密码和其他密码传递给测试

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

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

最佳答案

  • 如果运行用户界面的用户知道密码,那么我并没有真正看到您的安全问题。你在防御谁?
  • 如果运行 UI 的用户不知道密码(并且密码应该存储在测试用例本身中),那么您就会陷入困境 - 加密很好,但您必须以某种方式存储密码才能解密……无尽的循环,没有安全的空间。即使存储是安全的,弱点也肯定是到浏览器的传输(无论如何,这将作为封装在 JSON 中的纯字符串完成)以及自动输入到浏览器本身。说真的,如果您不信任运行测试的机器,就不要存储密码。

但是,对于第一种情况(当用户必须在 UI 中输入密码时),为了最大限度地减少威胁的可能性并最大限度地方便,我会这样做:

  1. 创建 singletonPasswordHolder
  2. 一个PasswordHolder会记住 JPasswordField 中的密码 ( given to them by Map<String, char[]> )或Map<String, Password>其中 key 是一些密码标识符,value 是密码本身
  3. 一旦通过 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;
}

}

关于java - 将密码传递给junitcore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10829522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com