I have a chunk of data that I need to round-trip through a service that I don't trust, and I want to make sure the data hasn't been tampered with in-transit. I have limited memory and limited storage, so I can't hold onto a copy of the original data to compare against. I don't care about the secrecy of the data, only that it hasn't been modified. My data is already serialized as a byte stream. I don't need to demonstrate to any other service that this data hasn't been modified, only to myself.
As I understand it, the "right" way to do this is to store an asymmetric key locally. I send the service the data, an IV, and a signature of the data signed with my local key. When I get the bundle back I can use the data and the IV with my local key to verify that the signature is correct.
But signing things is time-expensive. Hashing things is faster, and I don't need to prove accuracy outside of my own application. Instead I would like to store some secret bytes. I send the service the data and a hash generated from the data and my secret. When I get the bundle back I can re-hash it using the data and my secret and compare the hashes. I never send the service my secret, so I don't see a way for them to tamper with the data and not break the hash.
Is there a problem doing this that I don't see?
Is it safe if I reuse the secret for all messages that I send to the service?