Androidの端末IDを作る

欲しいもの

  • Android端末を識別したい
  • ANDROID_IDという端末固有IDは使いたくない
  • SIMのIDも使いたくない
    • 機種変した時も移行させるとかめんどそう
    • 他のアプリも使っているだろうし
    • 変えれないと、ID漏れた時にセキュリティの人がトマホーク持って襲ってきそう

仕様

ANDROID_IDと時刻からMD5を作って、SharedPreferenceに他のアプリからは読めないpermissionで保存する事にした

ID生成

1回目の呼び出しで生成、以後は保存された値を返す

    public String id(){
        SharedPreferences pref = activity.getPreferences(activity.MODE_PRIVATE);
        String id = pref.getString("device_id", "");
        if(id.length() < 1){
            String android_id = Settings.Secure.getString(this.getContentResolver(), Settings.System.ANDROID_ID);
            long now = (long)(new Date().getTime()/1000);
            id = MD5.hexdigit(android_id+"_"+now);
            pref.edit().putString("device_id", id).commit();
        }
        return id;
    }

ID再生性

作りなおす

    public String id_reset(){
        this.getPreferences(activity.MODE_PRIVATE).edit().putString("device_id", "").commit();
        return id();
    }

MD5の作り方

MD5java.security.MessageDigestを使ったら作れた

import java.security.*;
public class MD5 {
    public static String hexdigit(Object o) {
        try {
            MessageDigest msgDigest = MessageDigest.getInstance("MD5");
            msgDigest.update(o.toString().getBytes());
            byte digest[] = msgDigest.digest();
            StringBuffer hexStr = new StringBuffer();
            for (int i=0; i<digest.length; i++){
                hexStr.append(Integer.toHexString(0xFF&digest[i]));
            }
            return hexStr.toString();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return "";
    }
}