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权限