web-dev-qa-db-fra.com

Encodage Base 64 avec Scala ou Java

J'ai essayé :

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

RÉSULTAT:

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

J'ai aussi essayé:

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

RÉSULTAT:

result: String = user%3Apass

Basé sur http://www.base64encode.org/ La valeur que je recherche pour le résultat doit être "dXNlcjpwYXNz"

Que fait le site différemment de ces encodages? Aussi, comment pourrais-je imiter le site en Java/Scala?

Remarque, l'application spécifique est destinée à un en-tête utilisant l'authentification de base.

34
Erick Stone

Pour obtenir "user: pass" en "dXNlcjpwYXNz", vous devez encoder en base64 la chaîne encodée UTF-8, mais pas hacher.

En utilisant la bibliothèque de goyave tierce, je peux exécuter

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

et je sors

dXNlcjpwYXNz

comme demandé. Les autres encodeurs Base64 devraient fonctionner de la même manière.

16
Louis Wasserman

Depuis Java 8, il existe des classes utilitaires pratiques directement dans la bibliothèque standard: Base64.Decoder et Base64.Encoder . Il existe également des méthodes d'usine statiques pour construire des instances de ces classes qui effectuent le codage/décodage Base64 pour différentes versions de Base64 dans Base64 classe.

Voici comment utiliser l'encodeur:

import Java.util.Base64
import Java.nio.charset.StandardCharsets

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

On a demandé à Scala:

import Java.nio.charset.StandardCharsets

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

assume(Java.util.Base64.getEncoder.encodeToString(password)==expected)
11
Epicurist

Si vous utilisez scalaj (j'étais), vous pouvez simplement le faire:

import scalaj.http.Base64

Base64.encodeString(str)

Ou

import scalaj.http.HttpConstants._

base64(str)
7
dcastro