我必须为Android应用程序创建自定义文件格式(基于字节)。 格式的主要目的是保存AES加密文件(字节数据)和解密它所需的一些元数据(例如IV,Salt和几个应用程序设置)。
关于如何设计和实现这个问题我有几个问题:
目前的想法是从4个字节的幻数开始,然后是格式的版本号。接下来是IV和Salt。然后我将包括原始(未加密)数据的前4kb的校验和,因此我可以快速解密第一个4kb并检查提供的密钥是否正确。然后是整个原始(未加密)数据的校验和,这样我也可以检查整个文件。 这是标题。 (我需要((未)加密的)数据的长度吗?数据的偏移量?整个(标题+正文)文件的校验和?)
对于正文(现在加密)我想添加原始文件名和扩展名(应该使用多少字节?)。 然后是原始文件。
我找到的两个主要方法是ByteArrayOutputStreams和RandomAccessFiles。使用第一个选项我缺少搜索选项,比如如何在特定位置写入(即校验和)?第二个似乎运作良好,但也许有更好的解决方案可用。
答案 0 :(得分:0)
对于我的H2数据库,我实现了一个文件系统抽象,具有多个文件系统实现,包括encrypted file。还有许多其他文件系统实现,例如缓存包装器等等。
我会使用XTS(XEX-based tweaked-codebook mode with ciphertext stealing),这就是我实施的内容。它允许随机访问读取和写入,并且比纯AES慢得多。
你建议的标题对我来说听起来不错:幻数,然后是格式的版本号。我结合了幻数和版本号(不同的版本会产生不同的幻数)。使用XTS,不需要IV。 Salt,我会使用很多,例如8个字节。我还存储了散列迭代来散列密码,我使用了PBKDF2。我认为使用像PBKDF2这样的东西很重要。
我将标头长4096字节,以匹配常规文件系统的块大小。如果您使用固定的块大小进行读写,这应该可以提高性能。我没有使用任何校验和,因为我的底层(未加密)文件有校验和。我认为这足够好,并且可能比存储未加密的未加密数据校验和更安全,但我不确定。
对于API,使用$('#run').click(function () {
var geojson = $.parseJSON($('#geojson').val());
// Initiate the chart
$('#container').slideDown().highcharts('Map', {
series: [{
mapData: geojson
}]
});
});
或ByteBuffer
都很好。使用byte[]
,支持内存映射文件更简单。