文件名的java Base64编码安全吗?
在Windows和Linux系统上,文件名使用Base64编码安全吗?从我的研究中,我发现用-
或_
替换结果的所有/
字符可以解决任何问题
有人能提供更多细节吗
目前在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('/','_');
# 1 楼答案
修改后的Base64(当
/
、=
和+
被替换时)可以安全地创建名称,但由于许多文件系统和URL不区分大小写,因此不能保证反向转换Base64区分大小写,因此在不区分大小写的文件系统(所有Windows文件系统,忽略POSIX子系统情况)中,它不能保证1对1的映射。大多数URL也不区分大小写,防止1对1映射
在这种情况下,我将使用Base32——您将获得更长的名称,但是Base32编码的值对于文件/uri的使用是100%安全的,无需替换任何字符,并且即使在不敏感的环境(FAT/Win32 NTFS访问)中也能保证1对1的映射
不幸的是,框架中通常没有对这种编码的内置支持。另一方面,自己编写或在线查找代码相对简单
http://en.wikipedia.org/wiki/Base32
# 2 楼答案
Base64创建的文件名只有在使用与/不同的字符时才是安全的,因为NTFS不允许在文件名中使用该字符。只要你这么做,基本上常用的all commonly used file systems就可以了
但是,如果文件系统不区分大小写,就像Windows上的情况一样,则可能会发生冲突,因为Base64字母表同时包含大小写
您可能想考虑使用MD5哈希的十六进制表示,因为这是一种将字符串表示为字符串的非常标准的方法。p>
# 3 楼答案
我不确定你使用的是什么编码,但是考虑percent encoding文件名。
# 4 楼答案
C#的一个班轮:
需要在文件开头添加以下内容: