Skip to content

Instantly share code, notes, and snippets.

@syafdia
Created February 2, 2019 11:39
Show Gist options
  • Save syafdia/b8ca1fc9d76618a533dbe8a8ea91f877 to your computer and use it in GitHub Desktop.
Save syafdia/b8ca1fc9d76618a533dbe8a8ea91f877 to your computer and use it in GitHub Desktop.
class AppSignatureHelper(context: Context) : ContextWrapper(context) {
/**
* Get all the app signatures for the current package
* @return
*/
// Get all package signatures for the current package
// For each signature create a compatible hash
fun getAppSignatures(): ArrayList<String> {
val appCodes = ArrayList<String>()
try {
val packageName = packageName
val packageManager = packageManager
val signatures = packageManager.getPackageInfo(packageName,
PackageManager.GET_SIGNATURES).signatures
for (signature in signatures) {
val hash = hash(packageName, signature.toCharsString())
if (hash != null) {
appCodes.add(String.format("%s", hash))
}
}
} catch (e: PackageManager.NameNotFoundException) {
Log.e(TAG, "Unable to find package to obtain hash.", e)
}
return appCodes
}
private fun hash(packageName: String, signature: String): String? {
val appInfo = "$packageName $signature"
try {
val messageDigest = MessageDigest.getInstance(HASH_TYPE)
messageDigest.update(appInfo.toByteArray(StandardCharsets.UTF_8))
var hashSignature = messageDigest.digest()
// truncated into NUM_HASHED_BYTES
hashSignature = Arrays.copyOfRange(hashSignature, 0, NUM_HASHED_BYTES)
// encode into Base64
var base64Hash = Base64.encodeToString(hashSignature, Base64.NO_PADDING or Base64.NO_WRAP)
base64Hash = base64Hash.substring(0, NUM_BASE64_CHAR)
Log.d(TAG, String.format("pkg: %s -- hash: %s", packageName, base64Hash))
return base64Hash
} catch (e: NoSuchAlgorithmException) {
Log.e(TAG, "hash:NoSuchAlgorithm", e)
}
return null
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment