Как правильно писать и читать байты (код подтверждения сообщения) из файла
Я создаю небольшое программное обеспечение, которое генерирует 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));