SHA512的功能针对不同的输入返回相同的结果

时间:2019-04-15 16:09:27

标签: java passwords sha512 secret-key

我正在尝试实现一个登录屏幕,其中所有输入均通过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 []填充为“空”或null。

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

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

Little Disclamer:有些函数或变量是用_制成的,因为我阅读困难。请不要屠杀我不使用名称约定。 T

1 个答案:

答案 0 :(得分:0)

所提供的代码有很多问题,首先它使用静态弱盐。尽管有比PBKDF2(➽Argon2,BCrypt,SCrypt)更好的算法来保护密码,但是如果正确实现,可以使用 。我想向您推荐著名的Defuse库,它使密码哈希和验证变得轻而易举,它可以作为单个类文件包含在内。

顺便说一句,哈希密码不能撤消,哈希与加密不同。