加密ArcGIS离线地图及其在Android上的实现


加密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”就是自己定义的保密标识符,这个保密标识符只有数据的发布者才知道,因此第三方无法通过设备标识符自行生成校验值。最后,可以将校验值保存在一个以设备序号命名的文件中,和数据一起发布(多个设备使用多个校验文件,增加删除都很方便)。

image

图 1 与数据一同部署的校验文件

  • 1
  • 2
  • 3
  • 4
  • 下一页

相关内容