【问题标题】:Working with JPasswordField and its getText/getPassword method使用 JPasswordField 及其 getText/getPassword 方法
【发布时间】:2013-08-20 14:03:09
【问题描述】:

大家好,我正在处理我的游戏服务器和客户端之间的第一条通信。显然由于我是从零开始,所以我对程序的每个部分都进行了仔细的投影。

我在 Swing API 中查找,发现 JPasswordField 是一个普通的 InputField,但用于密码。

如果调用了已弃用的方法 getText(),则返回一个字符串,如果调用 getPassword,则返回一个字符数组。

阅读 SO 我明白使用 getText 或类似的东西不是一个好主意

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

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

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

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

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

我还返回一个散列字符串,这有什么问题吗?从哈希开始找到密码应该是相当困难的;)

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

【问题讨论】:

    标签: java swing jpasswordfield getpasswd


    【解决方案1】:

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

    【讨论】:

    • 我也想知道我用来计算哈希的方法是否安全。
    【解决方案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();
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 2011-10-15
      相关资源
      最近更新 更多