使用 Scala 或 Java 进行 Base 64 编码

2022-09-01 00:17:24

我试过:

val md = java.security.MessageDigest.getInstance("SHA-1")
val result = new sun.misc.BASE64Encoder().encode(md.digest("user:pass".getBytes))

结果:

md: java.security.MessageDigest = SHA-1 Message Digest from SUN, <initialized>
result: String = smGaoVKd/cQkjm7b88GyorAUz20=

我也试过:

import java.net.URLEncoder
val result = URLEncoder.encode(user + ":" + pass, "UTF-8")

结果:

result: String = user%3Apass

基于 http://www.base64encode.org/ 我想要的结果值应该是“dXNlcjpwYXNz”

该网站与这些编码有什么不同?另外,我如何在Java / Scala中模仿该网站?

请注意,特定应用程序适用于使用基本身份验证的标头。


答案 1

从Java 8开始,标准库中直接有方便的实用程序类:Base64.DecoderBase64.Encoder。还有一些静态工厂方法来构造这些类的实例,这些实例在Base64类中对各种类型的Base64执行Base64编码/解码。

以下是使用编码器的方法:

import java.util.Base64
import java.nio.charset.StandardCharsets

Base64.getEncoder.encodeToString("user:pass".getBytes(StandardCharsets.UTF_8))

答案 2

要将“user:pass”转换为“dXNlcjpwYXNz”,您应该对UTF-8编码字符串进行base64编码,但不要进行哈希处理。

使用第三方番石榴库,我可以运行

System.out.println(BaseEncoding.base64()
    .encode("user:pass".getBytes(Charsets.UTF_8)));

然后我就出去了

dXNlcjpwYXNz

根据要求。其他 Base64 编码器的工作方式也类似。


推荐