Я делаю базовую систему аутентификации пользователей на консоли в Java.Пользователь вводит свое имя пользователя и пароль, и я сохраняю зашифрованный пароль с SHA-512 в файле.Затем я предлагаю пользователю «войти», и мне нужно подтвердить, что пароль, который они ввели на этот раз, является паролем, который они ввели, когда они «зарегистрировались».Проблема возникает в части проверки.Когда я храню пароль, я сохраняю соль вместе с ним в файле.Но поскольку соль представляет собой массив byte[]
, он показывает то же самое [B@232204a1
, когда я преобразую его в строку и сохраню в файле.
Через этот ответ что я сделалбыло то, что я хранил значения массива солт-байтов в строке, объединяя их вместе, чтобы это было непрерывное значение и его было легче прочитать во время проверки.
В части проверки я правильно прочитал сохраненную соль, нокогда я использую .getBytes()
, а затем использую тот же код из ссылки выше, он выдает значение, отличное от того, которое я сохранил.И, следовательно, когда я использую его для вычисления хешированного пароля, он, очевидно, дает мне неправильный ответ.
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Scanner;
public class authenticationSystem {
private byte[] salt;
public static void main(String[] args) throws NoSuchAlgorithmException
{
Scanner sc = new Scanner(System.in);
byte[] salt = getSalt();
System.out.println("Enter 1 for Sign up and 2 for log in and -1 to exit");
int option = Integer.parseInt(sc.nextLine());
switch(option) {
case 1:
System.out.println("Enter Username: ");
String username = sc.nextLine();
System.out.println("Enter Password: ");
String passwordToHash = sc.nextLine();
boolean signupResult = signUp(username, passwordToHash, salt);
if(signupResult == false) {
System.exit(0);
}
else {
System.out.println("SignUp Successful");
break;
}
case 2:
System.out.println("Enter Username: ");
username = sc.nextLine();
System.out.println("Enter Password: ");
passwordToHash = sc.nextLine();
boolean loginResult = logIn(username, passwordToHash);
if(loginResult == false) {
System.out.println("Authentication Failed!");
break;
}
else {
System.out.println("Authentication Successful!");
break;
}
}
}
private static boolean logIn(String username, String password) {
String absolutePath = "C:\\Users\\asadn\\eclipse-workspace\\output.txt";
File file = new File(absolutePath);
try(BufferedReader bufferedReader = new BufferedReader(new FileReader(absolutePath))) {
String currentLine = null;
int count=1;
while((currentLine = bufferedReader.readLine()) != null) {
if(currentLine.equals(username)) {
currentLine = bufferedReader.readLine(); //get to line with salt
System.out.println(currentLine);
byte[] salt = currentLine.getBytes();
System.out.println(salt);
for(int i = 0; i<salt.length; i++) {
System.out.print(salt[i] & 0x00FF);
System.out.print("");
}
System.out.println("");
currentLine = bufferedReader.readLine(); //get to line with hashedPassword
String passwordToMatch = currentLine; //store in a string variable for comparison
System.out.println(passwordToMatch);
String passwordRetrieved = get_SHA_512_SecurePassword(password, salt);
System.out.println(passwordRetrieved);
if(passwordToMatch.equals(passwordRetrieved)){
return true;
}
}
}
} catch (FileNotFoundException e) {
// exception handling
} catch (IOException e) {
// exception handling
}
return false;
}
private static boolean signUp(String username, String hashedPassword, byte[] salt) {
String absolutePath = "C:\\Users\\asadn\\eclipse-workspace\\output.txt";
File file = new File(absolutePath);
String saltInStringFormat = "";
for(int i = 0; i<salt.length; i++) {
saltInStringFormat+=Integer.toString(salt[i] & 0x00FF);
}
// write the content in file
try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file, true))) {
String securePassword = get_SHA_512_SecurePassword(hashedPassword, salt);
bufferedWriter.write(username);
bufferedWriter.newLine();
bufferedWriter.write(saltInStringFormat);
bufferedWriter.newLine();
bufferedWriter.write(securePassword);
bufferedWriter.newLine();
bufferedWriter.close();
} catch (IOException e) {
// exception handling
return false;
}
return true;
}
private static String get_SHA_512_SecurePassword(String passwordToHash, byte[] salt)
{
//Use MessageDigest md = MessageDigest.getInstance("SHA-512");
String generatedPassword = null;
try {
MessageDigest md = MessageDigest.getInstance("SHA-512");
md.update(salt);
byte[] bytes = md.digest(passwordToHash.getBytes());
StringBuilder sb = new StringBuilder();
for(int i=0; i< bytes.length ;i++)
{
sb.append(Integer.toString((bytes[i] & 0xff + 0x100), 16).substring(1));
}
generatedPassword = sb.toString();
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
return generatedPassword;
}
//Add salt
private static byte[] getSalt() throws NoSuchAlgorithmException
{
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
byte[] salt = new byte[16];
sr.nextBytes(salt);
return salt;
}
}
Теперь я понимаю, что я ошибаюсь при преобразовании байта в строку и обратно, но у меня естьнет другой идеи о том, как заставить это работать с файлом.Буду очень признателен, если кто-нибудь сможет мне помочь.