Let's suppose I have an Android application that needs to make some API call. I want to authenticate the deployed applications to that my API cannot be used by unauthorized clients.
I can put anything inside the application - HTTP headers that sign the requests, complete with nonces. However, if someone decompiles the application he will be able to replicate the method of authentication, like the algorithm for generating the signature and the shared secret. With Java and Android this is not unfeasible.
Is it possible to avoid? Probably not, but I wanted to be sure that cryptography has no solutions for me.