Soru Base64 Dosya isimleri için güvenli kodlama?


Base64 kodlama Windows ve Linux sistemlerinde dosya isimleri için güvenli midir? Araştırmamdan, hepsini değiştirmeyi buldum. / sonucun karakterleri - veya _ herhangi bir sorunu çözmeli.

Bu konuda daha fazla bilgi veren var mı?

Şu anda Java'da aşağıdaki kodları kullanıyorum:

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

25
2017-10-15 19:42


Menşei


/ geçerli bir base64 karakteri (No. 63) gibi görünüyor ama gerçek dünyada hiç görmedim: en.wikipedia.org/wiki/Base64 - Pekka 웃
Windows dosya sistemlerinin büyük / küçük harfe duyarlı olmadığını unutmayın. Eşsiz bir hash haritasına benzersiz bir dosyaya güvenemezsiniz. - laalto


Cevaplar:


Modifiye Base64 (ne zaman /,= ve + değiştirilir) isimleri oluşturmak için güvenlidir, ancak birçok dosya sistemi ve URL'lerin büyük / küçük harf duyarsızlığı nedeniyle ters dönüşümü garanti etmez.

Base64 büyük / küçük harfe duyarlıdır, bu nedenle büyük / küçük harf duyarlı olmayan dosya sistemlerinde (tüm Windows dosya sistemleri, POSIX alt sistemi durumlarını göz ardı ederek) 1'e 1 eşlemeyi garanti etmez. Çoğu URL'ler, 1'e 1 eşlemeyi engelleyen büyük / küçük harf duyarlıdır.

Bu durumda Base32'yi kullanırdım - isimleri biraz daha uzun süre alırsınız, ancak Base32 kodlanmış değerler herhangi bir karakteri değiştirmeden dosya / uri kullanımı için% 100 güvenlidir ve duyarsız ortamlarda bile 1'e 1 eşlemeyi garantiler. / Win32 NTFS erişimi).

Maalesef, bu kodlama için çerçevelerde genellikle yerleşik destek yoktur. Diğer yandan, kendiniz yazmak veya çevrimiçi bulmak için kod oldukça basittir.

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


28
2017-10-15 20:09



Base_encode işlevini php'de kullanabilirsiniz, bkz. stackoverflow.com/questions/1848601/... - Mark
@Mark base_encode, PHP'de sayı olarak gösterilebilen değerler için tam olarak uygundur ve kesin hassasiyet platforma bağlıdır, ancak 14 ondalık basamaktan (yaklaşık 9 baz32 basamak) herhangi bir şey tamsayı kesinliğini koruyarak dizeleri / karmaları için uygun değildir. . - thomasrutter
Guava destekliyor Base32 kodlaması şimdi. - Rob Worsnop
Değiştirilmiş Base64 (/, = ve + değiştirilir) isimleri oluşturmak için güvenlidir, ancak birçok dosya sistemlerinin ve URL'lerin büyük / küçük harf duyarsızlığı nedeniyle ters dönüşümü garanti etmez. Detayları açıklayabilir misin? - gstackoverflow
@gstackoverflow Base64 büyük / küçük harfe duyarlıdır, bu nedenle eğer geri dönüşümü bayt durumuna geri çevirmeye dikkat ederseniz, muhafaza durumu korunmalıdır ("Baaa" -> "05 A6 9A", fakat "BAAA" => "04 00 00"). FAT / FAT32 dosya adında büyük harf olarak normalize edilir - bu nedenle dosya sisteminden okunan dosya ismini bayt dizisine dönüştürebilirsiniz. Benzer şekilde, çoğu zaman, Urls parametreleri, aynı soruna neden olan normalleştirilir (genellikle yanlış anlaşılmalarladır). Ayrıca bazı dosya sistemleri (NTFS) büyük / küçük harfe duyarlıdır, ancak adların yalnızca duruma göre değişmesine izin vermez - bu nedenle, farklı baytlardan "benzersiz" NTFS adları oluşturamazsınız. - Alexei Levenkov


Ne için kodlama kullandığınızdan emin değilim, ama düşünün yüzde kodlama dosya adları.

  • Her dosya sisteminde çalışır
  • ASCII aralığında oldukları sürece dosya adlarını insan tarafından okunabilir tutar.

10
2017-10-15 22:22





RFC 3548 sadece değiştirmek için değil önerir / karakter. URL ve Dosya adı güvenli Alfabe değiştirir:

  • 63: nd / alt çizgi karakteri _
  • 62: nd + eksi karakter -.

Ama belki bir HEX-String kullanmalısın. Bir dosyadaki karma değerini sakladığım bir süre oldu. Base64 String'i kullanmaya başladım, ancak Hex-String'e geçtim. Neden değiştirdiğimi hatırlamıyorum, çünkü belki de AndiDog'un dediği gibi “a” ve “A” arasında bir fark yaratmıyor.


9
2017-10-15 21:17



RFC 4648 hala aynı diyor ... - Thomas Jensen


C # için tek liner:

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

Dosyanın başına aşağıdakileri gerektirir:

using System.Security.Cryptography
using System.Text

3
2017-12-09 04:10



Bu durum-duyarsızlık problemini ele almıyor. - Dan Bechard
Ve ben bu tek liner demezdim .. Kodu okurken yatay kaydırma gerektirir - Andrii Abramov


Base64 tarafından oluşturulan bir dosya adı, NTFS'nin bu karakterin dosya adlarında kullanılmasına izin vermediğinden, / 'dan farklı bir karakter kullanırsanız, yalnızca güvenlidir. Bunu yaptığınız sürece, hemen hemen tüm yaygın olarak kullanılan dosya sistemleri ortak kullanımda Tamam olacak.

Ancak, dosya sistemi büyük küçük harf duyarsızWindows'da olduğu gibi, Base64 alfabesi hem büyük hem de küçük harf içerdiğinden çarpışmalar alabilirsiniz.

Bunun yerine MD5 hashınızın onaltılık temsilini kullanmayı düşünebilirsiniz, çünkü bu, bunları bir dizge olarak temsil etmenin oldukça standart bir yoludur.


2
2017-10-15 19:55





Genellikle MD5 karmaları (genelde kareler) Base64 yerine onaltılık dizeler olarak temsil edilir, bu da sadece [a-f0-9] içerir. Bu isimler tüm dosya sistemleri tarafından desteklenecek.

Eğer gerçekten Base64 kullanmak istiyorsanız, çözümünüz (eğik çizgileri değiştirmek), Windows dosya sistemleri 'A' ve 'a' arasında bir fark yaratmadığından doğru şekilde çalışmayacaktır. Belki bunun yerine Base32 kullanmak ister misin? Ancak Base32'nin 8 bitten 4 bittiğini aklınızdan çıkarmayın, bu yüzden onaltılık gösterimi almak daha kolay olacaktır.

Genel olarak, Windows ve / veya Linux'ta aşağıdaki karakterlere izin verilmez: \ /: *? "<> |


1
2017-10-15 19:54