not multiple length getbytes error encoded codificacion array java hash encoding base64 filenames

java - multiple - Base64 ¿La codificación es segura para los nombres de archivo?



java return base64 (6)

¿Es seguro usar la codificación Base64 para nombres de archivos en sistemas Windows y Linux? De mi investigación descubrí que reemplazar todos / caracteres del resultado con - o _ debería resolver cualquier problema.

¿Alguien puede proporcionar más detalles sobre esto?

Actualmente en Java estoy usando el siguiente fragmento de código:

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


Modificado Base64 (cuando / , = y + son reemplazados) es seguro para crear nombres, pero no garantiza la transformación inversa debido a la insensibilidad de mayúsculas y minúsculas de muchos sistemas de archivos y direcciones URL.

Base64 distingue entre mayúsculas y minúsculas, por lo que no garantiza la asignación de 1 a 1 en los casos de sistemas de archivos que no distinguen entre mayúsculas y minúsculas (todos los sistemas de archivos de Windows, ignorando los casos del subsistema POSIX). La mayoría de las URL también son insensibles a las causas y previenen la asignación de 1 a 1.

Utilizaría Base32 en este caso - obtendrá nombres un poco más largos, pero los valores codificados en Base32 son 100% seguros para el uso de archivos / uri sin reemplazar ningún carácter y garantiza el mapeo de 1 a 1 incluso en casos de ambiente insensible (FAT / Acceso Win32 NTFS).

Lamentablemente, generalmente no hay soporte incorporado para esta codificación en frameworks. Por otro lado, el código es relativamente fácil de escribir usted mismo o encontrar en línea.

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


No estoy seguro para qué está usando la codificación, pero considere el porcentaje de nombres de archivos de codificación .

  • Funciona en todos los sistemas de archivos
  • Mantiene los nombres de archivos legibles para humanos siempre que estén dentro del rango ASCII

One-liner para C #:

String filename = Convert.ToBase64String(new SHA256Managed().ComputeHash(Encoding.UTF8.GetBytes("UTF-8 string with snowmen"))).Replace("+", "_").Replace("/", "-").Replace("=","");

Necesita lo siguiente al comienzo del archivo:

using System.Security.Cryptography using System.Text


Por lo general, los hashes MD5 (hash en general) se representan como cadenas hexadecimales en lugar de Base64, que solo contienen [a-f0-9]. Esos nombres serían compatibles con todos los sistemas de archivos.

Si realmente quiere usar Base64, su solución (reemplazando barras) no funcionará correctamente ya que los sistemas de archivos de Windows no hacen una diferencia entre ''A'' y ''a''. ¿Quizás quieras usar Base32 en su lugar? Pero tenga en cuenta que Base32 hace 8 bits de 4, por lo que será más fácil simplemente tomar la representación hexadecimal.

En general, los siguientes caracteres no están permitidos en Windows y / o Linux: / /: *? "<> |


Un nombre de archivo creado por Base64 solo es seguro si usa un carácter diferente de /, lo que hace, ya que NTFS no permite que ese carácter se use en nombres de archivo. Mientras lo haga, casi todos los sistemas de archivos de uso común de uso común estarán bien.

Sin embargo, si el sistema de archivos no distingue entre mayúsculas y minúsculas , como es el caso de Windows, puede obtener colisiones porque el alfabeto Base64 contiene mayúsculas y minúsculas.

Es posible que desee considerar el uso de la representación hexadecimal de su hash MD5 en su lugar, ya que esta es una forma bastante estándar de representarlos como una cadena.


RFC 3548 sugiere no solo reemplazar el / carácter. La URL y el nombre de archivo seguro Alphabet reemplaza:

  • el 63: nd / character con el guion bajo _
  • el personaje 62: nd + con el signo menos - .

Pero quizás sea mejor que uses una HEX-String. Ha pasado un tiempo, cuando almacené un valor hash en un nombre de archivo. Empecé con el uso de Base64 String pero cambié a un Hex-String. No recuerdo por qué cambié, tal vez porque Windows no hace diferencia entre ''a'' y ''A'' como dijo AndiDog.