我正在尝试实现一个登录屏幕,其中所有输入均通过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
答案 0 :(得分:0)
所提供的代码有很多问题,首先它使用静态弱盐。尽管有比PBKDF2(➽Argon2,BCrypt,SCrypt)更好的算法来保护密码,但是如果正确实现,可以使用 。我想向您推荐著名的Defuse库,它使密码哈希和验证变得轻而易举,它可以作为单个类文件包含在内。
顺便说一句,哈希密码不能撤消,哈希与加密不同。