Android app如何进行安装授权控制
1.App如何进行安装授权控制?
限制App的使用,使App只能在有许可的设备上运行。可以利用公钥加密算法制作的Licence进行授权管控。
原理
让App在每次运行的时候都连接服务器进行合法性验证——当然是一个很成熟可靠的方案;
但是这样做的局限也是每次都需要连接服务器,对一些不需要联网或者只连局域网的内部应用来说就太不可行了——服务端验证不可行的话就只能在客户端验证了。
一种客户端验证方法的基本原理:
取一个唯一的设备号A。在客户端根据一个加密算法f(A)算出一个许可号B。要求用户输入一个许可号C(Licence),与B进行比较,完成验证。步骤
设备号A可以是序列号(Serial Number)、MAC地址、蓝牙地址、ANDROID_ID、IMEI号等等。加密算法f(x)从A->B的变换可以使用md5、字符串大小写变换、字符串增删、顺序变化等各种变换的组合。但是最好要满足两个条件:
结果唯一:这个是必须条件,是验证可靠性的保证。过程不可逆:这个非必须的,但是最好如此,可以增加破译的难度。将用户的输入的Licence保存到客户端——只需要输入一次。Android的验证可以放在首个启动的Activity的OnResume方法中,或者直接放在Applaction的onCreate方法中。 条件允许的情况下,可以使用服务端和客户端的双重验证,以保证Licence的正确性。
2.如何获取Android设备唯一识别码?
如果我们想唯一识别一台Android设备,就需要获取设备的唯一识别码。怎么获取呢?
下面是Android设备一些可供选择的唯一识别码及其适用范围:
IMEI (International Mobile
Equipment Identity Number,国际移动设备识别码)
用于在手机网络中识别每一部独立的手机对于不在手机网络的设备(如Android平板),就不能使用IMEI来识别。IMSI
(International Mobile Subscriber Identity,国际移动用户识别码)
它是在公众陆地移动电话网(PLMN)中用于唯一识别移动用户的一个号码,在GSM网络,这个号码通常被存放在SIM卡中跟IMEI一样,对于不在手机网络的设备就不能使用IMSI来识别。Android ID
64位的十六进制字符串,设备首次启动时会随时生成如果设备恢复了出厂设置,这个值可能会改变设备root了之后,这个值可以手动修改Android 2.2发现bug,部分设备具有相同Android ID(9774d56d682e549c
),模拟器的Android ID也是这个这个值有时会为null一般不推荐使用Device ID
唯一的设备ID,如GSM网络的IMEI,CDMA网络的MEID / ESN,可能返回null(API文档的描述)只对手机设备有效,对于不在手机网络的设备,会返回null获取到的Device ID值,即使设备恢复出厂设置也不会改变需要READ_PHONE_STATE权限某些设备的Device ID实现有bug,会返回0或*Serial Number
从Android 2.3开始(API level 9),可以通过android.os.Build.SERIAL
获取需要READ_PHONE_STATE权限WiFi MAC Address
不是所有Android设备都有WiFi对于有WiFi的设备,如果WiFi没有开启,可能获取不了WiFi MAC地址需要ACCESS_WIFI_STATE权限BlueTooth MAC Address
如果没有开启BlueTooth,可能获取不了BlueTooth MAC地址需要BLUETOOTH权限