加密ArcGIS离线地图的思路
目前,使用Compact格式的切片文件是离线地图的一个很好的方案,但是,如果我们可能会希望限制离线地图不被第三方程序使用;或者,希望限制离线地图只被经过授权的设备使用。在这样的需求下,我们必须保护好部署在智能设备上的离线地图数据,因此,需要对离线地图数据进行加密。
在这里,我使用了这样的一个思路,其中包含以下主要环节:
1. 经授权的设备序号+保密的标识符再经过MD5生成校验值。
2. MD5校验值与加密的离线数据一起分发,由于第三方程序无法得知保密的标识符,因此无法生成正确的校验值。
3. 离线数据的加密通过加密索引文件实现,加密通过字节交换实现,这样可以基本不影响性能。
4. 读取加密文件的算法封装在动态连接库中,确保第三方无法通过反编译手段获得算法。
下面详细叙述各个环节的实现。
设备唯一身份的确认设备的唯一序号可能在不同种类的系统上都有不同获取的方法,通过CPU序号、IMEI编号、MAC地址等多种途径的组合可以生成每个设备都不同的标识符,比如在Android中,可以以IMEI和IMSI的组合生成一个序号:
TelephonyManager tm = (TelephonyManager) this
.getSystemService(Context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId();
String imsi = tm.getSubscriberId();
deviceId = String.format("%s-%s", imei, imsi);
比如我这里得到一个设备标识“000000000000000-310260000000000”,下面根据不同情况,对上述的设备标识附加一个保密的标识符,再计算其MD5校验值:
String id = String.format("%s-%s", deviceId, "wuyf_qwert");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(id.getBytes());
result = StringUtil.bytesToHexString(bytes);
这里的“wuyf_qwert”就是自己定义的保密标识符,这个保密标识符只有数据的发布者才知道,因此第三方无法通过设备标识符自行生成校验值。最后,可以将校验值保存在一个以设备序号命名的文件中,和数据一起发布(多个设备使用多个校验文件,增加删除都很方便)。
图 1 与数据一同部署的校验文件