Base64编码对文件名安全吗?

cwe*_*ton 32 java hash base64 filenames encoding

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('/','_');
Run Code Online (Sandbox Code Playgroud)

Ale*_*kov 34

修改的Base64(时/,=+被替换)安全地创建名字,但不保证逆变换由于许多文件系统和URL不区分大小写.

Base64是大小写敏感的,所以它不会保证不区分大小写的文件系统的情况下,1对1的映射(所有Windows文件系统,而忽略POSIX子系统的情况下).大多数网址也不区分大小写,防止1对1映射.

我想在这种情况下使用Base32 - 你会得到的名字有点长,但Base32编码的值是100%安全的文件/ URI使用无需更换任何字符,甚至在环境敏感的情况下,保证了1对1的映射(FAT/Win32 NTFS访问).

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

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


Chr*_*mer 10

RFC 3548建议不仅要替换/角色.该URL和文件名安全字母代替:

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

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


Pek*_*ica 10

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

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