如何从文件中准确地写入和读取字节(消息验证码)

时间:2019-04-18 20:57:28

标签: java cryptography javax.crypto message-authentication-code

我正在创建一个小型软件,该软件可以基于文件生成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,但不等于“ bytes”不等于mac.dofinal()...我想我不能只是将字节写到文件中并希望在读取时得到相同的字节它?我会怎么做呢?

我已经打开了文件,而且文件太乱了(很可能将字节转换为字符,不知道哈哈)

1 个答案:

答案 0 :(得分:0)

您的问题是使用ObjectOutputStream进行书写,而使用BufferedReader进行阅读。 如果您使用ObjectOutputStream时使用ObjectInputstream,那么您也应该在写入后调用OutputStream.flush()。 您根本不应该使用ObjectOutputStream进行写作,而应该使用InputStreamOutputStream。 您可以使用以下示例:

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));