Skip to content

Instantly share code, notes, and snippets.

@prakashpro3
Created October 30, 2023 05:35
Show Gist options
  • Save prakashpro3/832f6e2abf35a0a403f659f44e725b48 to your computer and use it in GitHub Desktop.
Save prakashpro3/832f6e2abf35a0a403f659f44e725b48 to your computer and use it in GitHub Desktop.
Generate App signature(Hash)
package com.guruplus.app.utils
import android.content.Context
import android.content.ContextWrapper
import android.content.pm.PackageManager
import android.util.Base64
import android.util.Log
import java.nio.charset.StandardCharsets
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException
import java.util.*
//TODO: Warning: Make sure to delete this class before release build for play store / production
class AppSignatureHelper(context: Context?) :
ContextWrapper(context) {// Get all package signatures for the current package
// For each signature create a compatible hash
/**
* Get all the app signatures for the current package
*
* @return
*/
val appSignatures: ArrayList<String>
get() {
val appCodes = ArrayList<String>()
try {
// Get all package signatures for the current package
val packageName = packageName
val packageManager = packageManager
val signatures = packageManager.getPackageInfo(
packageName,
PackageManager.GET_SIGNATURES
).signatures
// For each signature create a compatible hash
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
}
companion object {
val TAG = AppSignatureHelper::class.java.simpleName
private const val HASH_TYPE = "SHA-256"
const val NUM_HASHED_BYTES = 9
const val NUM_BASE64_CHAR = 11
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