目前,使用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 與數據一同部署的校驗文件