【问题标题】:Base64 special characters new FileBase64 特殊字符新文件
【发布时间】:2014-12-31 08:43:42
【问题描述】:

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

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

字符串“fileNameEncrypted”包含正斜杠和反斜杠,可能还有其他文件名不允许使用的字符。此外,正斜杠与子文件夹混淆。

我该如何解决这个问题?

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

【问题讨论】:

  • 不不,我正在加密文件名,然后对其进行编码以获得一个新文件名,该文件名是我要用于上传到保管箱的文件的文件名。对不起,我很着急,又看了一遍我没有说清楚的问题

标签: android base64 filenames


【解决方案1】:

[根据 cmets 编辑整个消息]

因为 base64 编码使用特殊字符 (/) 和小写/大写字符,它似乎不太符合某些操作系统(如 windows)的文件名。其中文件“aaa.txt”等于“AAA.txt”。

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

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

base16 中的 char 'A' = 0x41。你可以写成“41”

一个更完整的例子

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

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

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

您可以使用 Guava 库在 base16 或 base32 上执行转换,它们的字符集比 windows 的 base64 更兼容。

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

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

【讨论】:

  • 是的,好点。您实际上是在重复我链接的问题中包含的重复内容。不能回答重复的问题。不过,您可以尝试其他角度,例如使用 Base32 编码甚至 HEX。
  • 对不起,我是一个经验不足的用户,对 SO 响应的反应,我之前的评论出现了一些错误并删除了它。在发布我的第一个答案之前,我没有看到您的重复评论。第二点我已经删除了我之前的评论,我指出你对'='是正确的,但是因为base64使用上下(a-A)char并且windows没有区分它们,这可能会导致问题。我会更加谨慎地回答下一个问题;)
【解决方案2】:

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

Base64.encodeToString(encrypted, Base64.URL_SAFE)

Documentation:

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

【讨论】:

  • @ArtjomB。注意android 标签——重复的只是java。使用 android.util.Base64 是不同的。
猜你喜欢
  • 2016-05-05
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2016-12-14
  • 2010-11-09
  • 2015-07-13
  • 1970-01-01
相关资源
最近更新 更多