2014-11-04 101 views
1

我正在使用Android,開發一個將文件上傳到Dropbox的應用程序。因爲我不想看到這些文件的標題,所以我正在對它們進行加密並對結果字節數組進行編碼。問題是,當您使用的句子:Base64特殊字符新文件

String fileNameEncrypted = Base64.encodeToString(encrypted, Base64.DEFAULT); 
File file = new File(mDirectoryPath + "/" + fileNameEncrypted); 

字符串「fileNameEncrypted」包含向前和向後斜線和不允許的文件名可能是其它字符。此外,正斜槓與子文件夾混淆。

我該如何解決這個問題?

PS:我的目標是文件名無法在保管箱中讀取。

+0

不,不是,我正在加密文件名,然後編碼它以獲得一個新的文件名,這是我想用於我上傳到保管箱的文件。對不起,我很着急,再看看我的問題,我沒有讓自己清楚 – Fernando 2014-11-04 18:16:16

回答

2

[編輯根據意見,整個消息]

由於使用Base64編碼使用特殊字符(/)和小寫/大寫字符,這似乎不是很符合文件名,如Windows操作系統的一些。文件「aaa.txt」等於「AAA.txt」。

即使base64的安全模式使用大寫字母和小寫字母。

的ASCII十六進制格式(base16)提供了一個更加符合字符集0-9 A-F爲存儲字節數組

炭在base16 'A'= 0×41。你可以寫這個爲「41」

一個更完整的例子

「的test.txt」可以翻譯成:746573742E747874

如果你需要真正隱藏你的名字可以將編碼與散列函數結合起來。因爲散列是單向函數,所以你肯定會隱藏文件名,但是你不能從這裏恢復真實的名字。

如果你需要一個雙向的功能,你可以像使用AES簡單的加密方法與內部密鑰

可以使用番石榴庫執行誰擁有更柔順的字符集比的base64上base16或base32改造爲windows。

byte[] encrypted = "test.txt".getBytes(); 
BaseEncoding encoder = BaseEncoding.base16().lowerCase(); 
String newFilename = encoder.encode(encrypted); 

如果您想使用base32 juste更改編碼器。

+0

是的,好點。你基本上重複了我所鏈接的問題中包含的內容,它是重複的。回答重複的問題是不好的。雖然,你可以嘗試另一個角度,例如Base32編碼甚至HEX。 – 2014-11-04 13:18:19

+0

對不起,我的用戶反應很差,我曾經對我以前的評論做過一些錯誤並刪除它。 我發表我的第一個答案之前,我沒有看到您的重複評論。 Secont point我刪除了我以前的評論,我指出你對'='正確,但是因爲base64使用上限和下限(a-A)字符,而且窗口沒有區別它們,這可能導致問題。我會對我的下一個答案更審慎;) – Manticore 2014-11-04 13:30:35

2

您可以使用文件名安全模式下的base64編碼器

Base64.encodeToString(encrypted, Base64.URL_SAFE) 

Documentation

編碼器/解碼器標誌位使用Base64編碼的「URL和文件名安全」的變體來表示(見RFC 3548第4節)其中 - 和_用於代替+和/。

+0

@ArtjomB。注意'android'標籤 - 重複只是java。使用'android.util.Base64'是不同的。 – laalto 2014-11-05 10:31:20