43

我试过了 :

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 中的站点?

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

4

4 回答 4

90

从 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))
于 2014-08-19T05:59:03.710 回答
17

要将“user:pass”转换为“dXNlcjpwYXNz”,您应该对 UTF-8 编码的字符串进行 base64 编码,而不是散列。

使用第三方 Guava 库,我可以运行

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

我出去

dXNlcjpwYXNz

按照要求。其他 Base64 编码器应该类似地工作。

于 2013-08-14T19:57:53.907 回答
11

有人问斯卡拉:

import java.nio.charset.StandardCharsets

val (password, expected) = ("user:pass".getBytes(StandardCharsets.UTF_8), "dXNlcjpwYXNz")

assume(java.util.Base64.getEncoder.encodeToString(password)==expected)
于 2014-11-12T13:45:31.273 回答
7

如果您使用的是scalaj(我是),您可以简单地执行以下操作:

import scalaj.http.Base64

Base64.encodeString(str)

或者

import scalaj.http.HttpConstants._

base64(str)
于 2015-10-03T20:33:28.873 回答