我会尽量简短,但我会分享全貌。
问题陈述
我使用来自mapbox
的{{3}}的向量图块来创建.pbtiles
数据中的geojson
。问题是,当我看到inspect element
并下载.pbf
并通过此tippecanoe库运行它时,在Web客户端上,我能够成功从磁贴中获取数据。这意味着任何一个具有一些基本谷歌搜索的人也可以从矢量图块中窃取我的数据。
我能够实现的目标
为了避免安全问题,我的时间很短,我想出了一个快速而肮脏的方法。在tippecanoe
创建.mbtiles
sqlite数据库之后,我运行了一个java实用程序,我使用blob
加密来加密AES 256
中的数据并将其以两种不同的方式存储在两个中不同的sqlite db' s:
将字节存储到不同的.mbtiles
sqlite数据库中(将其作为Blob存储)。与z, x, y
和metadata
将加密数据编码为base64
,然后将base64encoded加密磁贴数据存储到字符串数据类型列中。以及z, x, y
和metadata
。
并将密钥(base64编码)和初始化向量(base64编码)存储到文件中。
API方(问题1)
现在,当我从API获取非加密.pbf
时,会设置类型为gzip
和application/x-protobuf
的标头,以帮助将未加密的blob
数据转换为一个protobuf
并返回一个下载的.pbf
文件。
现在,当我尝试使用与非加密时相同的标头从API获取加密数据时,.pbf
的下载无法说明Failed - Network error
。我意识到它是由于标题application/x-protobuf
试图将文件打包成.pbf
而导致的,而blob的内容可能与预期的内容不匹配,因此结果
我删除了标题application/x-protobuf
,因为我现在不能gzip
,我也删除了gzip
的标题。现在数据显示在Chrome浏览器上而不是被下载,我现在认为它只是一个随机响应。
问题是,如何让它发送一个已加密数据的.pbf
,这个((mapbox-vector-tile-cs))库可以解析数据?我知道在我为parsing
传递数据之前需要首先对数据进行解密,假设它已被解密并且我将数据存储到blob
的{{1}}中}。
此图书馆包含UWP项目(问题2)
所以现在如上所述(因为我没有解决标题部分的问题)我删除了标题并让API给我一个直接的回复。
现在我面临的问题是,当我传入解密后(我检查解密成功并且解密数据与存储在.mbtiles
中的Blob数据完全匹配)到< / p>
Blob
代码行返回var layerInfos = VectorTileParser.Parse(stream);
IEnumerable<Tile>
,其中not null
但0 layers
。而实际的图块中包含5 layers
。
我的问题是,如何让这个((mapbox-vector-tile-cs))库返回图层。
在我为parsing
发送磁贴之前从服务器获取磁贴并解密的代码如下:
//this code downloads the tile, layerInfos is returned as an empty collection
private async Task<bool> ProcessTile(TileData t, int xOffset, int yOffset)
{
var stream = await GetTileFromWeb(EncryptedTileURL,true);
if (stream == null)
return false;
var layerInfos = VectorTileParser.Parse(stream);
if (layerInfos.Count == 0)
return false;
return true;
}
使用GetTileFromWeb()
方法从服务器获取切片:
private async Task<Stream> GetTileFromWeb(Uri uri, bool GetEnc = false)
{
var handler = new HttpClientHandler();
if (!GetEnc)
handler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
var gzipWebClient = new HttpClient(handler);
var bytes = gzipWebClient.GetByteArrayAsync(uri).Result;
if (GetEnc)
{
var decBytes = await DecryptData(bytes);
return decBytes;
}
var stream = new MemoryStream(bytes);
return stream;
}
PS:抱歉这么长的问题,我不习惯这么精细的细节,但似乎我需要分享更多,因为加密是我的强项,而地图数据矢量图块不是。