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 文件包含。
顺便说一句,散列密码无法逆转,散列与加密不同。
我正在尝试实现一个登录屏幕,其中您的所有输入都由 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 文件包含。
顺便说一句,散列密码无法逆转,散列与加密不同。