Base64 Кодировка безопасна для имен файлов? - PullRequest
30 голосов
/ 15 октября 2010

Безопасно ли использовать кодировку 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('/','_');

Ответы [ 6 ]

33 голосов
/ 16 октября 2010

Модифицированный Base64 (при замене /, = и +) безопасен для создания имен, но не гарантирует обратного преобразования из-за нечувствительности к регистру многих файловых систем и URL-адресов.

Base64чувствителен к регистру, поэтому он не гарантирует отображение 1-к-1 в случаях нечувствительных к регистру файловых систем (все файловые системы Windows, игнорируя случаи подсистемы POSIX).Большинство URL-адресов также нечувствительны к регистру, предотвращая отображение 1-к-1.

В этом случае я бы использовал Base32 - вы получите имена немного длиннее, но значения в кодировке Base32 на 100% безопасны для использования файла / URI беззаменяет любые символы и гарантирует отображение 1-к-1 даже в случаях нечувствительной среды (доступ к FFS / Win32 NTFS).

К сожалению, в фреймворках обычно нет встроенной поддержки этой кодировки.С другой стороны, код относительно просто написать самостоятельно или найти в Интернете.

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

10 голосов
/ 16 октября 2010

Я не уверен, для чего вы используете кодировку, но рассмотрите процентную кодировку имен файлов.

  • Это работает в каждой файловой системе
  • Имена файлов остаются читаемыми людьми, пока они находятся в диапазоне ASCII
10 голосов
/ 16 октября 2010

RFC 3548 предлагает не только заменить символ /. URL и безопасное имя файла Алфавит заменяет:

  • символ 63: nd / с подчеркиванием _
  • 62: nd + символ с минусом -.

Но, возможно, вам лучше использовать HEX-String. Прошло некоторое время, когда я сохранил хеш-значение в имени файла. Я начал с использования Base64 String, но переключился на Hex-String. Я не помню, почему я переключился, возможно, потому что Windows не делает различий между «а» и «А», как сказал AndiDog.

3 голосов
/ 09 декабря 2011

Однострочник для 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
2 голосов
/ 15 октября 2010

Обычно MD5-хэши (вообще хэши) представлены в виде шестнадцатеричных строк вместо Base64, которые затем содержат только [a-f0-9].Эти имена будут поддерживаться всеми файловыми системами.

Если вы действительно хотите использовать Base64, ваше решение (замена слешей) не будет работать корректно, поскольку файловые системы Windows не делают различий между «A» и «a»,Может быть, вы хотите использовать Base32 вместо этого?Но имейте в виду, что Base32 составляет 8 бит из 4, поэтому будет проще взять шестнадцатеричное представление.

В общем, следующие символы не разрешены в Windows и / или Linux: \ /: *?"<> |

1 голос
/ 15 октября 2010

Имя файла, созданное Base64, безопасно только в том случае, если вы используете другой символ из /, что вы и делаете, поскольку NTFS не позволяет использовать этот символ в именах файлов. Пока вы это делаете, в значительной степени все обычно используемые файловые системы в общем пользовании будут в порядке.

Однако, если файловая система не чувствительна к регистру , как в случае с Windows, вы можете столкнуться, потому что алфавит Base64 содержит как верхний, так и нижний регистр.

Возможно, вы захотите использовать вместо этого шестнадцатеричное представление вашего хэша MD5, поскольку это довольно стандартный способ представления их в виде строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...