使用JPasswordField及其getText / getPassword方法

时间:2013-08-20 14:03:09

标签: java swing jpasswordfield getpasswd

大家好,我正在进行游戏服务器和客户端之间的第一次通信。显然,由于我从零开始,我正在仔细地预测程序的每个部分。

我正在寻找Swing API,我发现JPasswordField是一个普通的InputField,但是对于密码。

如果调用了不推荐使用的方法getText(),则返回知道字符串的字符串,如果调用getPassword,则返回字符数组。

阅读SO我明白使用getText不是一个好主意,也不是

String password = String.valueOf(passwordField.getPassword());

因为这样做我正在创建一个可以长时间保留在内存中的String。

我尝试创建的是可以在不使用字符串的情况下转换该密码的东西,我创建了这个:

public static String digest(char[] in) throws NoSuchAlgorithmException {

    MessageDigest md = MessageDigest.getInstance("SHA-256");

    ArrayList<Byte> list = new ArrayList<Byte>();
    for(int i = 0; i<in.length; i++){
        String ch = String.valueOf(in[i]);
        byte[] b = ch.getBytes();
        for(int j = 0; j<b.length;j++){
            list.add(b[j]);
        }
    }
    byte[] inputInByte = new byte[list.size()];
    for(int i =0;i<list.size();i++){
        inputInByte[i] = list.get(i);
    }
    md.update(inputInByte);

    byte byteData[] = md.digest();

    StringBuffer hexString = new StringBuffer();
    for (int i = 0; i < byteData.length; i++) {
        String hex = Integer.toHexString(0xff & byteData[i]);
        if (hex.length() == 1) {
            hexString.append('0');
        }
        hexString.append(hex);
    }
    return hexString.toString();
}

问题是:这个算法是否正确并且有利于密码的安全性?我不得不使用String从char转换为byte。

我也返回一个哈希字符串,有什么问题吗?从哈希开始查找密码应该非常困难;)

数据库连接怎么样? Hsqldb允许我创建查询,但每个查询都是一个字符串......

2 个答案:

答案 0 :(得分:3)

使用SHA-256摘要是一种哈希方法,而不是一种密码方法。它就像一个指纹。你可以从他的指纹中找到一个人而不测试每个人的(60亿)指纹吗?不。它用于在php中的数据库中存储密码。我们只存储pass的散列,当用户想要连接时,我们计算新输入的密码散列,并将其与数据库的散列进行比较。 这可以防止用户在数据库遭到黑客攻击时窃取密码。但是你无法从哈希中获取密码。我希望我回答你的问题。 顺便说一句,考虑使用apache lib进行消息摘要,我认为更安全

答案 1 :(得分:2)

我认为您的代码非常好,但您仍在使用String来创建字节值,因此您最好将String.valueOf(in[i]);更改为以下内容:

public static String digest(char[] in) throws NoSuchAlgorithmException {

    MessageDigest md = MessageDigest.getInstance("SHA-256");

    ArrayList<Byte> list = new ArrayList<Byte>();
    for(int i = 0; i<in.length; i++){
        byte b = (byte) in[i]
        list.add(b);
    }
    byte[] inputInByte = new byte[list.size()];
    for(int i =0;i<list.size();i++){
        inputInByte[i] = list.get(i);
    }
    md.update(inputInByte);

    byte byteData[] = md.digest();

    StringBuffer hexString = new StringBuffer();
    for (int i = 0; i < byteData.length; i++) {
        String hex = Integer.toHexString(0xff & byteData[i]);
        if (hex.length() == 1) {
            hexString.append('0');
        }
        hexString.append(hex);
    }
    return hexString.toString();
}

这比使用循环和两步转换为字节更容易。