Base64特殊字符新文件

时间:2014-11-04 12:45:36

标签: android base64 filenames

我在Android工作,开发一个应用程序,我将文件上传到dropbox。由于我不希望看到这些文件的标题,我正在对它们进行加密并对结果进行字节编码。问题是当你使用句子时:

String fileNameEncrypted = Base64.encodeToString(encrypted, Base64.DEFAULT);
File file = new File(mDirectoryPath + "/" + fileNameEncrypted);

字符串" fileNameEncrypted"包含正斜杠和反斜杠以及文件名不允许的其他字符。此外,正斜杠与子文件夹混淆。

我怎么能解决这个问题?

PS:我的目标是无法在Dropbox应用中读取文件名。

2 个答案:

答案 0 :(得分:2)

[根据评论编辑整个信息]

因为base64编码使用特殊字符(/)和低/大写字符,所以它似乎不像某些操作系统(如windows)那样非常符合文件名。文件" aaa.txt"等于" AAA.txt"。

即使base64的安全模式也使用小写和大写字符集。

ASCII十六进制格式(base16)为存储字节数组提供更兼容的字符集0-9 A-F

  

char' A'在base16中= 0x41。您可以将其写为" 41"

更完整的例子

  

"的test.txt"可以翻译为:746573742E747874

如果您需要真正隐藏名称,可以将编码与哈希函数结合使用。因为哈希是单向函数,所以你肯定会隐藏文件名,但是你无法从中恢复真实姓名。

如果您需要双向功能,可以使用简单的加密方法,例如带内部密钥的aes

你可以使用Guava库在base16或base32上执行转换,它具有比base64更兼容的charset for windows。

byte[] encrypted = "test.txt".getBytes();
BaseEncoding encoder = BaseEncoding.base16().lowerCase();
String newFilename = encoder.encode(encrypted);

如果要使用base32 juste更改编码器。

答案 1 :(得分:2)

您可以在文件名安全模式下使用base64编码器

Base64.encodeToString(encrypted, Base64.URL_SAFE)

Documentation

  

编码器/解码器标志位指示使用" URL和文件名安全" Base64的变体(参见RFC 3548第4节),其中 - 和_用于代替+和/.