package kr.co.tadadang.user.util import android.content.Context import android.content.ContextWrapper import android.content.pm.PackageManager import android.os.Build import android.util.Base64 import android.util.Log import java.nio.charset.StandardCharsets import java.security.MessageDigest import java.security.NoSuchAlgorithmException import java.util.Arrays class AppSignatureHelper(context: Context) : ContextWrapper(context) { val TAG = AppSignatureHelper::class.java.simpleName private val HASH_TYPE = "SHA-256" val NUM_HASHED_BYTES = 9 val NUM_BASE64_CHAR = 11 init { getAppSignatures() } fun getAppSignatures(): ArrayList? { val appCodes = ArrayList() try { val packageName = packageName val packageManager = packageManager val signatures: Array? = packageManager.getPackageInfo( packageName, PackageManager.GET_SIGNATURES ).signatures if (signatures != null) { for (signature in signatures) { val hash = hash(packageName, signature.toCharsString()) if (hash != null) { appCodes.add(String.format("%s", hash)) } Log.e(TAG, "Hash $hash") } } } catch (e: PackageManager.NameNotFoundException) { Log.e(TAG, e.toString()) } return appCodes } private fun hash(packageName: String, signature: String): String? { val appInfo = "$packageName $signature" try { val messageDigest = MessageDigest.getInstance(HASH_TYPE) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { messageDigest.update(appInfo.toByteArray(StandardCharsets.UTF_8)) } var hashSignature = messageDigest.digest() hashSignature = Arrays.copyOfRange(hashSignature, 0, NUM_HASHED_BYTES) var base64Hash: String = Base64.encodeToString(hashSignature, Base64.NO_PADDING or Base64.NO_WRAP) base64Hash = base64Hash.substring(0, NUM_BASE64_CHAR) return base64Hash } catch (e: NoSuchAlgorithmException) { Log.e(TAG, e.toString()) } return null } }