2016-06-30 40 views
1

我在clojure很新。我沒有任何與java &有關的庫函數的經驗。我在clojure中編寫了一個函數,它使用java.util.Base64/getUrlEncoder返回base64加密數據。我的代碼如下所示:如何獲得不帶填充的加密數據?

user> (import java.util.Base64) 
java.util.Base64 
user> (let [encoder (Base64/getUrlEncoder)] 
     (String. (.encode encoder (.getBytes "Hello StackOverflow")))) 
"SGVsbG8gU3RhY2tPdmVyZmxvdw==" 

輸出包含填充以及(在最後兩個相等的跡象)。我想從我的輸出中刪除填充https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html#withoutPadding--我知道這是有用的解決我的問題,但我無法弄清楚如何使用沒有Padding()函數clojure。我試過這樣的事情:

user> (let [encoder (Base64/getUrlEncoder))] 
     (doto (java.util.Base64/Encoder (.withoutPadding (String. (.encode encoder (.getBytes "Hello StackOverflow")))))) 

但這是錯誤的。誰能告訴確切的解決方案?謝謝。

+0

的4個字節的Base64輸出的倍數,如果輸入不需要輸出則以用「=」字,那是何等的Base64作品。可以刪除「=」字符,而解碼器可能會接受但不是最多。根據Base64長度,您可以在解碼之前進行恢復和刪除,但不建議這樣做。只留下填充物,這是常見的做法。 – zaph

+0

要清楚,base64不是一種加密方法,它是一種編碼 – noisesmith

回答

4

你必須調用withoutPadding編碼器本身:

user> (import java.util.Base64) 
java.util.Base64 
user> (let [encoder (Base64/getUrlEncoder)] 
     (String. (.encode encoder (.getBytes "Hello StackOverflow")))) 
"SGVsbG8gU3RhY2tPdmVyZmxvdw==" 
user> (let [encoder (.withoutPadding (Base64/getUrlEncoder))] 
     (String. (.encode encoder (.getBytes "Hello StackOverflow")))) 
"SGVsbG8gU3RhY2tPdmVyZmxvdw"