有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

文件名的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('/','_');

共 (4) 个答案

  1. # 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. # 2 楼答案

    Base64创建的文件名只有在使用与/不同的字符时才是安全的,因为NTFS不允许在文件名中使用该字符。只要你这么做,基本上常用的all commonly used file systems就可以了

    但是,如果文件系统不区分大小写,就像Windows上的情况一样,则可能会发生冲突,因为Base64字母表同时包含大小写

    您可能想考虑使用MD5哈希的十六进制表示,因为这是一种将字符串表示为字符串的非常标准的方法。p>

  3. # 3 楼答案

    我不确定你使用的是什么编码,但是考虑percent encoding文件名。

    • 它适用于所有文件系统
    • 只要文件名在ASCII范围内,它就可以让人可读
  4. # 4 楼答案

    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