代码之家  ›  专栏  ›  技术社区  ›  cweston Given

Base64编码对文件名安全吗?

  •  30
  • cweston Given  · 技术社区  · 15 年前

    / 结果的特征 - _ 应该能解决任何问题。

    有谁能提供更多的细节吗?

    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('/','_');
    
    6 回复  |  直到 8 年前
        1
  •  35
  •   Alexei Levenkov    9 年前

    修改的Base64(当 / , = + 可以安全地创建名称,但不能保证反向转换,因为许多文件系统和url对大小写不敏感。

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

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

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

        2
  •  11
  •   Pekka    15 年前

    我不知道你用这个编码是为了什么,但是考虑一下 percent encoding 文件名。

    • 它可以在每个文件系统中工作
        3
  •  10
  •   Christian Ammer    15 年前

    RFC 3548 建议不仅替换 / 性格。这个 URL和文件名安全 字母表替换:

    • 63分 / 带下划线的字符 _
    • 第62次 + 带负号的字符 -

    但也许你最好用十六进制字符串。有段时间了,我在文件名中存储了一个散列值。我开始使用Base64字符串,但后来改为十六进制字符串。我不记得我为什么要换了,也许是因为AndiDog说Windows对a和a没有区别。

        4
  •  3
  •   AndiDog    15 年前

    通常MD5散列(通常是散列)表示为十六进制字符串,而不是Base64,后者只包含[a-f0-9]。所有文件系统都支持这些名称。

    如果您真的想使用Base64,那么您的解决方案(替换斜杠)将无法正常工作,因为Windows文件系统在“a”和“a”之间没有区别。也许你想改用Base32?但请注意,Base32是4的8位,所以采用十六进制表示会更容易。

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

        5
  •  3
  •   sigs    14 年前

    一行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
    
        6
  •  1
  •   Michael Madsen    15 年前

    all commonly used file systems 一般使用就可以了。

    不区分大小写 ,与Windows上的情况一样,您可以获得冲突,因为Base64字母表同时包含大写和小写。

    您可能需要考虑改用MD5哈希的十六进制表示,因为这是一种将它们表示为字符串的相当标准的方法。