Подтвердить что ты не робот

Base64 Кодирование безопасно для имен файлов?

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

Ответ 1

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

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

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

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

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

Ответ 2

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

  • Он работает в каждой файловой системе
  • Сохраняет имена файлов, доступные для чтения, если они находятся в диапазоне ASCII.

Ответ 3

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

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

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

Ответ 4

Однострочный для С#:

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

Ответ 5

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

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

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

Ответ 6

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

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

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