2016-06-30 29 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"