将密码传递给junitcore

时间:2012-05-31 07:56:35

标签: java selenium

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

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

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

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

1 个答案:

答案 0 :(得分:0)

  • 如果运行UI的用户知道密码,那么我并不真正看到您的安全问题。你是谁在捍卫?
  • 如果运行用户界面的用户不知道密码(并且密码应该存储在测试用户本身中),那么你就是腌菜 - 加密很好,但你必须存储密码以便以某种方式解密...无尽的圈子,没有安全的空间。即使存储是安全的,弱点肯定是转移到浏览器(无论如何都将以JSON封装的普通字符串完成)以及自动键入浏览器本身。说真的,如果你不相信运行测试的机器,就不要存储密码。

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

  1. 创建singleton课程PasswordHolder
  2. PasswordHolder会记住Map<String, char[]>Map<String, Password>中的密码(given to them by JPasswordField),其中密钥是密码标识符,值是密码本身
  3. 一旦通过getPassword()方法it's contents would get nullified
  4. 访问密码

    快速实施示例(为了进一步改进,我希望我不会忘记包含任何重要内容......但可能会发生)。我认为它有点说不出话来:

    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;
        }
    
    }