Java - значение соли, хранящейся в файле, и значение той же соли, извлеченной из файла, отличаются - PullRequest
0 голосов
/ 07 декабря 2018

Я делаю базовую систему аутентификации пользователей на консоли в 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;
    }
}

Теперь я понимаю, что я ошибаюсь при преобразовании байта в строку и обратно, но у меня естьнет другой идеи о том, как заставить это работать с файлом.Буду очень признателен, если кто-нибудь сможет мне помочь.

...