-
Android SMS Retriever Hash keyAndroid 2019. 4. 30. 00:14
SMS Retriever를 통해서 SMS을 읽으려면 문자속에 11자리 Hash key가 포함이 되어야한다.
Hash key를 얻는 방법은 2가지가 있고 key tool을 이용한 방법과 java 소스를 이용한 방법이 있다.
첫번째 Key Tool을 이용하는 방법으로는
1. 앱의 public key certificate를 아래의 커맨드를 통해 얻는다.
12keytool -alias MyAndroidKey -exportcert -keystore MyProduction.keystore | xxd -p | tr -d "[:space:]"Colored by Color Scripter2. PackageName + " " + public key certificate 을 만든다.
3. 위에서 만든 String을 SHA-256 sum으로 계산한다.
4. SHA-256 sum 한것을 Base64로 인코딩하여 11자리의 최종 hash 값을 얻는다.
1 ~ 4까지의 과정을 통해 얻은 hash 값은 아래의 명령어 하나로 얻을 수도 있다.
12keytool -exportcert -alias MyAndroidKey -keystore MyProductionKeys.keystore | xxd -p | tr -d "[:space:]" | echo -n com.example.myapp `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11Colored by Color Scripter두번째 방법은 java소스( AppSignatureHelper 클래스 )를 통해서도 얻을 수 있다.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667/*** This is a helper class to generate your message hash to be included in your SMS message.** Without the correct hash, your app won't recieve the message callback. This only needs to be* generated once per app and stored. Then you can remove this helper class from your code.*/public class AppSignatureHelper extends ContextWrapper {public static final String TAG = AppSignatureHelper.class.getSimpleName();private static final String HASH_TYPE = "SHA-256";public static final int NUM_HASHED_BYTES = 9;public static final int NUM_BASE64_CHAR = 11;public AppSignatureHelper(Context context) {super(context);}/*** Get all the app signatures for the current package* @return*/public ArrayList<String> getAppSignatures() {ArrayList<String> appCodes = new ArrayList<>();try {// Get all package signatures for the current packageString packageName = getPackageName();PackageManager packageManager = getPackageManager();Signature[] signatures = packageManager.getPackageInfo(packageName,PackageManager.GET_SIGNATURES).signatures;// For each signature create a compatible hashfor (Signature signature : signatures) {String hash = hash(packageName, signature.toCharsString());if (hash != null) {appCodes.add(String.format("%s", hash));}}} catch (PackageManager.NameNotFoundException e) {Log.e(TAG, "Unable to find package to obtain hash.", e);}return appCodes;}private static String hash(String packageName, String signature) {String appInfo = packageName + " " + signature;try {MessageDigest messageDigest = MessageDigest.getInstance(HASH_TYPE);messageDigest.update(appInfo.getBytes(StandardCharsets.UTF_8));byte[] hashSignature = messageDigest.digest();// truncated into NUM_HASHED_BYTEShashSignature = Arrays.copyOfRange(hashSignature, 0, NUM_HASHED_BYTES);// encode into Base64String base64Hash = Base64.encodeToString(hashSignature, Base64.NO_PADDING | Base64.NO_WRAP);base64Hash = base64Hash.substring(0, NUM_BASE64_CHAR);Log.d(TAG, String.format("pkg: %s -- hash: %s", packageName, base64Hash));return base64Hash;} catch (NoSuchAlgorithmException e) {Log.e(TAG, "hash:NoSuchAlgorithm", e);}return null;}}Colored by Color Scripter'Android' 카테고리의 다른 글
Android SMS Retriever API 사용하기 - SMS 인증번호 (1) 2019.04.30 안드로이드 마시멜로우(Android 6.0) 권한요청 - Custom Dialog( 2/2 ) (1) 2019.04.11 안드로이드 마시멜로우(Android 6.0) 권한요청 - System Dialog( 1/2 ) (0) 2019.04.10 안드로이드 스튜디오 Failed to maintain projects LRU cache 에러 (0) 2019.04.09 Android 64비트 대응하기 - ARM , X86, MIPS (1) 2019.04.08 댓글