Java 如何在没有填充的情况下获取加密数据?

Java 如何在没有填充的情况下获取加密数据?,java,clojure,base64,urlencode,Java,Clojure,Base64,Urlencode,我在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

我在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=="
最后,输出还包含两个等号。我想从输出中删除填充。 我知道这对解决我的问题很有用,但我不知道如何使用clojure中的adding函数。我试过这样的方法:

user> (let [encoder (Base64/getUrlEncoder))]
        (doto (java.util.Base64/Encoder (.withoutPadding (String. (.encode encoder (.getBytes "Hello StackOverflow"))))))
但这是错误的。有人能说出确切的答案吗?谢谢。

您必须在不添加编码器本身的情况下拨打电话:

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"
您必须在不添加编码器本身的情况下调用:

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"

Base64输出4字节的倍数,如果输入不需要用=字符填充输出,则Base64就是这样工作的。可以删除=字符,并且一些解码器可能接受这一点,但不是大多数。您可以在解码之前根据Base64长度进行恢复和删除,但不建议这样做。只需保留填充,这是常见的做法。要清楚,base64不是一种加密方法,它是一种编码base64输出4字节的倍数,如果输入不要求用=字符填充输出,则base64就是这样工作的。可以删除=字符,并且一些解码器可能接受这一点,但不是大多数。您可以在解码之前根据Base64长度进行恢复和删除,但不建议这样做。保留填充,这是常见的做法。要清楚,base64不是一种加密方法,它是一种编码