We've recently implemented anti-piracy code in the latest version of our app. It checks the digital signature of the APK against our own (known) signature to see if the app has been tampered with. This is based on a suggestion made in this post: https://groups.google.com/forum/?fromgroups=#!topic/android-developers/fPtdt6zDzns .
Here is the call we're using to obtain the APK's digital signature. As Dianne Hackborn explained in the thread, the "signature" is really the signing certificate's (i.e. our) public key, and this will not change from build to build: PackageManager pm = context.getPackageManager(); try { PackageInfo info = pm.getPackageInfo( "xxx.xxx.xxx.xxx", PackageManager.GET_SIGNATURES ); Signature[] sig = info.signatures; String sigstring = new String( sig[0].toChars() ); // Compare this signature with what we signed it with } On startup, our app now compares the public key returned by this function to an internal copy of our correct, known public key. If the comparison fails, the app posts a notification to our server, then quits. The notification contains a copy of the incorrect public key. Our anti-piracy code has been tripped twice. We've gotten the notification twice. Strangely, the first time was minutes after we uploaded our new APK to Google Play, before we made the new version public. In the 10 days since we uploaded this version, our app update has been downloaded and run thousands of times, with no further notifications. Then, on friday Jan 11th, we got another notification that our anti-piracy check has been triggered. In both cases, the incorrect public key was as follows: 308204a830820390a003020102020900b3998086d056cffa300d06092a864886f70d0101040500308194310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e20566965773110300e060355040a1307416e64726f69643110300e060355040b1307416e64726f69643110300e06035504031307416e64726f69643122302006092a864886f70d0109011613616e64726f696440616e64726f69642e636f6d301e170d3038303431353232343035305a170d3335303930313232343035305a308194310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e20566965773110300e060355040a1307416e64726f69643110300e060355040b1307416e64726f69643110300e06035504031307416e64726f69643122302006092a864886f70d0109011613616e64726f696440616e64726f69642e636f6d30820120300d06092a864886f70d01010105000382010d003082010802820101009c780592ac0d5d381cdeaa65ecc8a6006e36480c6d7207b12011be50863aabe2b55d009adf7146d6f2202280c7cd4d7bdb26243b8a806c26b34b137523a49268224904dc01493e7c0acf1a05c874f69b037b60309d9074d24280e16bad2a8734361951eaf72a482d09b204b1875e12ac98c1aa773d6800b9eafde56d58bed8e8da16f9a360099c37a834a6dfedb7b6b44a049e07a269fccf2c5496f2cf36d64df90a3b8d8f34a3baab4cf53371ab27719b3ba58754ad0c53fc14e1db45d51e234fbbe93c9ba4edf9ce54261350ec535607bf69a2ff4aa07db5f7ea200d09a6c1b49e21402f89ed1190893aab5a9180f152e82f85a45753cf5fc19071c5eec827020103a381fc3081f9301d0603551d0e041604144fe4a0b3dd9cba29f71d7287c4e7c38f2086c2993081c90603551d230481c13081be80144fe4a0b3dd9cba29f71d7287c4e7c38f2086c299a1819aa48197308194310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e20566965773110300e060355040a1307416e64726f69643110300e060355040b1307416e64726f69643110300e06035504031307416e64726f69643122302006092a864886f70d0109011613616e64726f696440616e64726f69642e636f6d820900b3998086d056cffa300c0603551d13040530030101ff300d06092a864886f70d01010405000382010100572551b8d93a1f73de0f6d469f86dad6701400293c88a0cd7cd778b73d I won't post a copy of our own (correct) public key here, but it is very different from the one above. We also collect the Android ID of the device being run on. The ID for the first trip detection (immediately after uploading the .apk) matches the ID of the detection we go on Friday. Our conclusion is that some internal Google Play process must be be repackaging our APK, for whatever reason, then running the repackaged version. Google Play must clearly be distributing our original, unaltered APK to end users; otherwise we would get this notification constantly (and all of our users would be complaining that the app quits on startup!) But we're mystified as to why we got this notification so soon after uploading the APK to google play. We can only assume it must be the result of some internal Google Play process. We can find no other explanation, especially since the first notification happened immediately after we uploaded the APK to google play, before we even made it public. Can anyone confirm whether such a repackaging is part of google play's normal process for newly-uploaded APKs? If so, this would greatly help put our minds at ease. If not, can anyone suggest any other possible explanation for the notification to have been sent? Once again - the only times our public-key-comparison-failed notification has been sent are 1) immediately after we uploaded the APK to google, and 2) again on Friday Jan 11th. In both cases the incorrect public key was the same. Although many thousands of users have downloaded the app update from Google Play, these are the only two instances in which our anti-piracy code has notified us that the public-key comparison has failed. We'd greatly appreciate any explanation anyone can provide. Bill -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en