ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android SMS Retriever Hash key
    Android 2019. 4. 30. 00:14

    SMS Retriever를 통해서 SMS을 읽으려면 문자속에 11자리 Hash key가 포함이 되어야한다.

    Hash key를 얻는 방법은 2가지가 있고 key tool을 이용한 방법과 java 소스를 이용한 방법이 있다.

     

     

    첫번째 Key Tool을 이용하는 방법으로는

    1. 앱의 public key certificate를 아래의 커맨드를 통해 얻는다.

    1
    2
    keytool -alias MyAndroidKey -exportcert -keystore MyProduction.keystore | xxd -p | tr -d "[:space:]"
     
    Colored by Color Scripter

     

     

    2. PackageName + " " + public key certificate 을 만든다.

    3. 위에서 만든 String을 SHA-256 sum으로 계산한다.

    4. SHA-256 sum 한것을 Base64로 인코딩하여 11자리의 최종 hash 값을 얻는다.

     

    1 ~ 4까지의 과정을 통해 얻은 hash 값은 아래의 명령어 하나로 얻을 수도 있다.

    1
    2
    keytool -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-11
     
    Colored by Color Scripter

     

     

     

     

     

    두번째 방법은 java소스( AppSignatureHelper 클래스 )를 통해서도 얻을 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    /**
     * 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 package
                String packageName = getPackageName();
                PackageManager packageManager = getPackageManager();
                Signature[] signatures = packageManager.getPackageInfo(packageName,
                        PackageManager.GET_SIGNATURES).signatures;
     
                // For each signature create a compatible hash
                for (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_BYTES
                hashSignature = Arrays.copyOfRange(hashSignature, 0, NUM_HASHED_BYTES);
                // encode into Base64
                String 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

     

     

     

     

     

    댓글

Designed by Tistory.