Base64编码对文件名安全吗?

Base64编码是否可以安全地用于Windows和Linux系统上的文件名? 根据我的研究,我发现用-_替换结果的所有/字符应解决任何问题。

任何人都可以提供更多细节吗?

目前在Java中我使用以下代码:

 MessageDigest md5Digest = MessageDigest.getInstance("MD5"); md5Digest.reset(); md5Digest.update(plainText.getBytes()); byte[] digest = md5Digest.digest(); BASE64Encoder encoder = new BASE64Encoder(); hash = encoder.encode(digest); hash.replace('/','_'); 

修改后的Base64(当替换/=+ )可以安全地创建名称,但由于许多文件系统和URL不区分大小写,因此无法保证反向转换。

Base64区分大小写,因此在不区分大小写的文件系统(所有Windows文件系统,忽略POSIX子系统情况)的情况下,它不保证一对一映射。 大多数url也不区分大小写,防止1对1映射。

在这种情况下我会使用Base32 – 你会得到更长的名字,但Base32编码值对于文件/ uri的使用是100%安全的,无需替换任何字符,即使在环境不敏感的情况下也能保证1对1的映射(FAT / Win32 NTFS访问)。

不幸的是,在框架中通常没有对此编码的内置支持。 另一方面,编写代码或在线查找代码相对简单。

http://en.wikipedia.org/wiki/Base32

我不确定您使用的编码是什么,但请考虑编码文件名的百分比 。

  • 它适用于每个文件系统
  • 只要文件名在ASCII范围内,它就可以保存文件名

RFC 3548建议不仅要替换/字符。 URL和文件名安全字母替换:

  • 带下划线的63:nd /字符_
  • 带有减号的62:nd +字符-

但也许你最好使用HEX-String。 有一段时间,我将哈希值存储在文件名中。 我开始使用Base64 String但切换到Hex-String。 我不记得为什么我换了,也许是因为Windows在’a’和’A’之间没有区别,正如AndiDog所说。

C#的单线程:

 String filename = Convert.ToBase64String(new SHA256Managed().ComputeHash(Encoding.UTF8.GetBytes("UTF-8 string with snowmen"))).Replace("+", "_").Replace("/", "-").Replace("=",""); 

需要以下内容到文件的开头:

 using System.Security.Cryptography using System.Text 

如果您使用与/不同的字符,则Base64创建的文件名是安全的,因为NTFS不允许在文件名中使用该字符。 只要你这样做,几乎所有常用的常用文件系统都可以。

但是,如果文件系统不区分大小写 (如Windows上的情况),则可能会发生冲突,因为Base64字母包含大写和小写。

您可能需要考虑使用MD5哈希的hex表示,因为这是将它们表示为字符串的相当标准的方式。

通常MD5哈希值(一般为哈希值)表示为hex字符串而不是Base64,后者只包含[a-f0-9]。 所有文件系统都支持这些名称。

如果你真的想使用Base64,你的解决方案(替换斜杠)将无法正常工作,因为Windows文件系统在’A’和’a’之间没有区别。 也许你想用Base32代替? 但请注意,Base32在4中产生8位,因此更容易采用hex表示。

通常,Windows和/或Linux中不允许使用以下字符:\ /:*? “<> |