2014-11-04 107 views
1

我正在使用Android,开发一个将文件上传到Dropbox的应用程序。因为我不想看到这些文件的标题,所以我正在对它们进行加密并对结果字节数组进行编码。问题是,当您使用的句子:Base64特殊字符新文件

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

字符串“fileNameEncrypted”包含向前和向后斜线和不允许的文件名可能是其它字符。此外,正斜杠与子文件夹混淆。

我该如何解决这个问题?

PS:我的目标是文件名无法在保管箱中读取。

+0

不,不是,我正在加密文件名,然后编码它以获得一个新的文件名,这是我想用于我上传到保管箱的文件。对不起,我很着急,再看看我的问题,我没有让自己清楚 – Fernando 2014-11-04 18:16:16

回答

2

[编辑根据意见,整个消息]

由于使用Base64编码使用特殊字符(/)和小写/大写字符,这似乎不是很符合文件名,如Windows操作系统的一些。文件“aaa.txt”等于“AAA.txt”。

即使base64的安全模式使用大写字母和小写字母。

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

炭在base16 'A'= 0×41。你可以写这个为“41”

一个更完整的例子

“的test.txt”可以翻译成:746573742E747874

如果你需要真正隐藏你的名字可以将编码与散列函数结合起来。因为散列是单向函数,所以你肯定会隐藏文件名,但是你不能从这里恢复真实的名字。

如果你需要一个双向的功能,你可以像使用AES简单的加密方法与内部密钥

可以使用番石榴库执行谁拥有更柔顺的字符集比的base64上base16或base32改造为windows。

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

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

+0

是的,好点。你基本上重复了我所链接的问题中包含的内容,它是重复的。回答重复的问题是不好的。虽然,你可以尝试另一个角度,例如Base32编码甚至HEX。 – 2014-11-04 13:18:19

+0

对不起,我的用户反应很差,我曾经对我以前的评论做过一些错误并删除它。 我发表我的第一个答案之前,我没有看到您的重复评论。 Secont point我删除了我以前的评论,我指出你对'='正确,但是因为base64使用上限和下限(a-A)字符,而且窗口没有区别它们,这可能导致问题。我会对我的下一个答案更审慎;) – Manticore 2014-11-04 13:30:35

2

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

Base64.encodeToString(encrypted, Base64.URL_SAFE) 

Documentation

编码器/解码器标志位使用Base64编码的“URL和文件名安全”的变体来表示(见RFC 3548第4节)其中 - 和_用于代替+和/。

+0

@ArtjomB。注意'android'标签 - 重复只是java。使用'android.util.Base64'是不同的。 – laalto 2014-11-05 10:31:20