SHA512的函数returns不同输入结果相同

The Function of SHA512 returns the same result for different inputs

我正在尝试实现一个登录屏幕,其中您的所有输入都由 SHA 512 加密,并且稍后会对功能进行一些小调整(反转字符串,延长长度)。对于我的用户名,加密效果很好,但另一方面,无论我输入什么,我的密码都会给我相同的结果。

 public static String password_encrypt(String input) {
    try {
        String password_ = input;

        int iterations = 250000;
        String salt = "salt";

        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");
        char[] passwordChars = password_.toCharArray();
        KeySpec spec = new PBEKeySpec(passwordChars, salt.getBytes(), iterations, 256);
        SecretKey key = factory.generateSecret(spec);

        byte[] passwordHash = key.getEncoded();

        SecretKey secret = new SecretKeySpec(key.getEncoded(), "AES");

        input = secret.toString();
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvalidKeySpecException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return input;
}

然后我检查一个数组是否有一个地方可以放置信息,如果有一个它存储在那里。

 for (int i = 0; i < username.length; i++) {
        System.out.println("username " + username[i]);
        if (name.equals(username[i])) {
            System.out.println("Dieser Username ist bereits vergeben!");
            break;
        }
        if ("empty".equals(username[i]) || null == username[i]) {
            username[i] = name;
            stelle = i;
            System.out.println("Username wurde vergeben");
            break;
        } 
        else if (name.equals(username[i])) {
            System.out.println("1234");
        }
    }
    for (int j = 0; j < password.length; j++) {
        System.out.println("Passwort " + password[j]);
        if ("empty".equals(password[j]) || null == password[j]) {
            System.out.println("Passwort wurde vergeben");
            password[j] = input_;
            stelle_pw = j;
            break;
        } 
        else if (input.equals(password[j])) {
            System.out.println("123");
        }
    }

我的构造函数将数组 username[] 和 password[] 填充为 "empty" 或 null。

我的主要问题是:无论输入什么密码,我得到的都是同一个密钥:javax.crypto.spec.SecretKeySpec@fffea4cc

如果我只是比较字符串以确定它是否正确,这会给我带来很大的安全漏洞...

小免责声明:有些函数或变量是用_做的,因为我有阅读障碍。请不要因为我没有使用名称约定而屠杀我。 T

提供的代码有几处错误,首先它使用了静态弱盐。虽然有比 PBKDF2(➽ Argon2、BCrypt、SCrypt)更好的密码保护算法,但如果正确实施,它 可以 使用。我想推荐著名的库 Defuse,它使密码散列和验证变得轻而易举,它可以作为单个 class 文件包含。

顺便说一句,散列密码无法逆转,散列与加密不同。