Base64 编码对文件名安全吗?

2022-09-01 05:52:24

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('/','_');

答案 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

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

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

但也许你最好使用十六进制字符串。已经有一段时间了,当我在文件名中存储哈希值时。我从使用Base64 String开始,但后来切换到了Hex-String。我不记得我为什么切换,也许是因为Windows在“a”和“A”之间没有区别,正如AndiDog所说。


推荐