I'm streaming MP3 files to users. Users are not allowed to share these files. I know that it's in the end impossible to not let anyone download the files. That's not the problem, people can download if they really want (but still I will try to prevent it as much as possible).
No, my problem is that if someone from the network still decides to download or record the file and share it on some public space like Youtube, there's no way for me to get to know which user this was.
I have an idea to make this possible, but it has limitations and I'm not even sure if it will work.
Add 'user-identifying noise' to the MP3 files. My idea would be to add some very little noise to the MP3 file, and for each user add slightly different noise. For example, for every frame we could increment its value or not, depending on a random, repeating bitstream which is unique for each user. This is a very small difference, so no one would actually hear this.
This technique would be preferable over adding frames before or after the file itself, because this could be cut off if the user who's going to share it sees in an audio analyser that the beginning or end is 'weird'. Accidentally incrementing frames will go almost unnoticed. If it's a concern that the average may get abnormally high, we could increment for a one in the bitstream, and decrement for a zero.
Also, it wouldn't be enough to just add some value to the ID3 properties of the file, as they can be seen and removed easily.
If someone shares the file...
Now, suppose we have set everything up as described: we added some noise that can identify the user. What we have to do is subtract the values of the original MP3 file from those of the file he shared. That way we get the bitstream with which we can find the user.
This setup will not work if a user plays the file on his computer but records it with his phone, as there will be some background noise that makes it impossible to reconstruct the user-identifying noise. It will only work if the user uses some program to record the sound his computer is making directly (thereby not introducing noise).
Also, it may be difficult (I'm not sure) to add this noise on the fly, which would be the best. If that would not be possible, it would be necessary to keep different copies of the MP3 files for each file for each user, which will cost a lot of disk space in the end.
Basically any kind of messing with the MP3 file by the user (excluding splitting, as we're using a repeated string) will break the system: speeding up/down, adding noise themselves, adding a second stream, etc.
There may be more limitations that I'm not aware of.
- Will my idea actually work?
- Am I reinventing the wheel? If so, what are common ways to do this?
- Can something be said about how possible exactly it is to add this noise on the fly?
- Do you see any possibility to make something like this work even if the user records the audio with his phone from his computer?