The research paper you are citing is from the founders of Arxan technologies. They have patents on protecting code in this way, where protection is about preventing people from reverse engineering. Many years prior to Arxan, Intertrust had some similar technologies. I have not studied Arxan in enough depth to understand what is novel about what they are doing, and I cannot comment on the legalities of the patents.
You originally phrased the question as a security question without giving the context on how it is security. You have now re-written it (thanks!) to make the security context more clear. You are interested in preventing code modification and/or reverse engineering.
Techniques to prevent code modification and/or reverse engineering are based upon obfuscation and self-checking. Security purists will never call obfuscation "security", but in practice it does make a big difference to slow down hackers from reverse engineering software.
Going back to your question, you ask whether one should use a checksum, digital signature, or a MAC for this type of protection. I'd recommend a cryptographic hash function instead. Here's why:
- A simple checksum is easy for a hacker to bypass. All he has to do is modify code in such a way that an instruction that never gets called at the end of his code modification cancels out his modifications to the previous part of the code.
- Digital signatures and MACs are based upon secrets, and in theory a hacker can always find those secrets in your code. This research paper showed how to do that many years ago (and it is practical and works!). Once the secrets are found, than a digital signature or MAC behaves essentially like a cryptographic hash, so the real reason to avoid these tools is that they are overkill for the problem you are trying to solve.
- Cryptographic hashes solve the same problem that checksums do, but they make it impossible for somebody to attack it the same way that one would attack a normal checksum: that is, if they modify the code, then they are also going to have to modify the checksum. In other words, there is no simple way to cancel out modifications of the code by inserting an instruction that does nothing at the end. (If you did find a way, then you would have computed a collision in the hash function, which means you broke the cryptographic hash function).
Despite these points, a single check in the software can still be bypassed in various ways. That's why you need guards to guard the guard, and guards above that, and so on, and you also need to be guarding your checksums (cryptographic hash output values), guarding above that, and so on. In the end, if you want practical security protection from code modifications and reverse engineering, this strategy is heading down a minefield of intellectual property from Arxan and/or Intertrust.