Как правильно писать и читать байты (код подтверждения сообщения) из файла

Я создаю небольшое программное обеспечение, которое генерирует MAC на основе файла, сохраняет этот Mac в файл, а затем проверяет, был ли этот файл Mac изменен с

Я пытался записать этот Mac в файл, а затем прочитать его, но когда я делаю это, он меняется

//CREATE AND WRITE
FileOutputStream fos = new FileOutputStream(MAC_FILE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(secretKey);

byte[] dataBytes = stringtogeneratefrom.getBytes("UTF-8"); 
mac.update(dataBytes);
oos.writeObject(mac.doFinal());

//READ
InputStream stream = new FileInputStream(MAC_FILE);
Scanner s = new Scanner(stream);

BufferedReader bf = new BufferedReader(new FileReader(MAC_FILE));
byte[] bytes;
bytes = bf.readLine().getBytes("UTF-8"); //tried without the getBytes as well

//Expected 
if(recalculateMAC.equals(bytes))
{
     return true;   
}

это должно вернуть true, но это не так, как "байты" не равны mac.dofinal()... я думаю, что я не могу просто записать байты в файл и ожидать получить те же байты, когда я его читаю? как бы я сделал это?

Я открыл файл, и это куча махинаций (вероятно, преобразование байтов в символы, не знаю, ха-ха)

1 ответ

Решение

Ваша проблема - использовать ObjectOutputStream для записи и BufferedReader для чтения. Если вы используете ObjectOutputStream использование ObjectInputstreamтакже вы должны звонить OutputStream.flush() после написания. То, что вы не должны писать ObjectOutputStream вообще, вы должны вместо этого использовать InputStream а также OutputStream, Вы можете использовать следующий пример:

SecureRandom random = new SecureRandom();
        byte[] secretKey = new byte[16];
        random.nextBytes(secretKey);

        String macFile = "MACFile.txt";
        String str = "Hello World";

        //CREATE AND WRITE
        OutputStream fos = new FileOutputStream(macFile);
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(secretKey, "HMACSHA256"));

        byte[] dataBytes = str.getBytes(StandardCharsets.UTF_8);
        mac.update(dataBytes);
        byte[] hashedData = mac.doFinal();
        fos.write(hashedData);
        fos.flush();

        //READ
        InputStream stream = new FileInputStream(macFile);

        byte[] bytes = stream.readAllBytes();

        System.out.println(Arrays.toString(bytes) + "\nVS\n" + Arrays.toString(hashedData));
        //Expected
        System.out.println(MessageDigest.isEqual(bytes, hashedData));
Другие вопросы по тегам